簡體   English   中英

桌面Delphi應用程序可以通過Windows 8認證(使用Windows App認證工具包)嗎?

[英]Can a desktop Delphi application be certified for Windows 8 (using Windows App Certification Kit)?

顯然,Delphi(任何版本) 都不支持安全的異常處理程序 (Visual Studio中的/ SAFESEH開關)。 在Windows 8上使用Windows桌面應用程序認證工具包時,這會導致警告。Windows 8桌面應用程序的認證要求如下:

您的應用必須使用/ SafeSEH標志進行編譯,以確保安全地處理異常

顯然,Delphi缺少此開關,因此無法完成。 我的問題是:

  1. 我的理解是否正確,即使套件僅顯示警告(不會失敗),因為這是“必須”的要求,所以當今任何Delphi應用都無法通過Windows 8認證,因此不能包含在Windows應用商店中?

  2. 是否可以在編譯后以某種方式將SafeSEH表添加到PE文件中(例如,從映射文件或調試符號中提取所需的信息),或者我們絕對需要對此提供編譯器/鏈接器支持,因此必須等到Embarcadero實現此功能?

為了明確起見,我的應用程序是Windows 32位桌面應用程序(兼容64位), 而不是Metro應用程序

我無法回答問題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部分。

據我所知,沒有質量控制報告要求對x86 Windows編譯器提供SafeSEH支持。 我建議您記錄一份質量控制報告和一個官方支持案例。

更新: @haimg在我失敗的地方成功並設法找到了QC報告: QC#106781,做得很好

還有其他因素導致無法批准Delphi的申請

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM