桌面Delphi应用程序是否可以通过Windows 8认证(使用Windows App认证工具包)?

时间:2012-07-31 05:45:40

标签: delphi windows-8 app-certification-kit wack

显然,Delphi(任何版本)does not support safe exception handlers(/ Visual Studio中的/ SAFESEH开关)。在Windows 8上使用Windows桌面应用程序认证工具包时会出现警告。对于Windows 8桌面应用程序,每个certification requirements

  

您的应用必须使用/ SafeSEH标记进行编译,以确保安全的异常处理

显然Delphi没有这个开关,所以无法完成。我的问题是:

  1. 我的理解是否正确,即使套件只显示警告(不是失败),因为这是一个"必须"要求,今天的任何Delphi应用程序都无法通过Windows 8认证,因此无法包含在Windows应用商店中?

  2. 可以在编译后以某种方式将SafeSEH表添加到PE文件中(例如从地图文件或调试符号中提取所需信息),或者我们绝对需要编译器/链接器支持,因此必须等到Embarcadero实现了这个功能吗?

  3. 要清除,我的应用程序是Windows 32位桌面应用程序(64位兼容),不是Metro应用程序

2 个答案:

答案 0 :(得分:3)

我无法回答问题1.但是,我发现很难想象使用这个词必须可能意味着该规则是可选的。

对于问题2,您需要编译器/链接器的支持。您无法合理地期望通过PE编辑后链接工具来适应这一点。请考虑以下代码:

try
  Beep;
except
  on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
end;

编译器发出以下内容:

Project1.dpr.11: try
0041C3AA 33C0             xor eax,eax
0041C3AC 55               push ebp
0041C3AD 68C9C34100       push $0041c3c9 // exception handler is at $0041c3c9
0041C3B2 64FF30           push dword ptr fs:[eax]
0041C3B5 648920           mov fs:[eax],esp
Project1.dpr.12: Beep;
0041C3B8 6A00             push $00
0041C3BA E8E1CEFEFF       call MessageBeep
0041C3BF 33C0             xor eax,eax
0041C3C1 5A               pop edx
0041C3C2 59               pop ecx
0041C3C3 59               pop ecx
0041C3C4 648910           mov fs:[eax],edx
0041C3C7 EB59             jmp $0041c422
0041C3C9 E97291FEFF       jmp @HandleOnException
0041C3CE 0100             add [eax],eax
0041C3D0 0000             add [eax],al
0041C3D2 E42F             in al,$2f
0041C3D4 41               inc ecx
0041C3D5 00DA             add dl,bl
0041C3D7 C3               ret 
0041C3D8 41               inc ecx
0041C3D9 00A3D83E4200     add [ebx+$00423ed8],ah
Project1.dpr.15: Writeln(E.ClassName, ': ', E.Message);
........

现在,真正的异常处理程序是HandleOnException,在System.pas中实现。但是,压入堆栈的地址是$0041c3c9,这是包含try/except块的代码的本地地址。这意味着,要创建SafeSEH PE部分,您需要在代码中找到每个try/except。虽然这显然是可行的,但我认为它不易处理。

我宁愿想象x86编译器的SEH异常处理程序只是_HandleXXX中声明的System.pas函数。在这种情况下,添加一个PE部分就可以很容易地将这些功能列为后链接步骤。但是,由于每个try/except都有自己的本地异常处理程序,我现在相信只有编译器作者才能真正希望添加SafeSEH PE部分。

据我所知,没有QC报告请求SafeSEH支持x86 Windows编译器。我建议您记录质量控制报告和官方支持案例。

更新:@haimg在我失败并成功找到质量控制报告后取得了成功:QC#106781

答案 1 :(得分:0)

还有其他因素导致Delphi的申请无法获得认证

http://delphitools.info/2012/08/23/why-no-native-winrt-support-in-delphi-xe3/

相关问题