Может ли приложение Delphi для настольного компьютера быть сертифицировано для Windows 8 (с помощью Windows App Certification Kit)?
По-видимому, Delphi (любая версия) не поддерживает безопасные обработчики исключений (ключ /SAFESEH в Visual Studio). Это приводит к предупреждению при использовании комплекта сертификации приложений для рабочего стола Windows в Windows 8. В соответствии с требованиями сертификации для приложений для настольных компьютеров Windows 8:
Ваше приложение должно быть скомпилировано с использованием флага /SafeSEH, чтобы обеспечить безопасную обработку исключений
Очевидно, Delphi не имеет этого переключателя, поэтому это невозможно сделать. Мои вопросы:
Верно ли мое понимание того, что, хотя комплект отображает только предупреждение (не сбой), поскольку это обязательное требование, любое приложение Delphi сегодня не может быть сертифицировано для Windows 8 и, следовательно, не может быть включено в магазин приложений Windows?
Можно ли каким-то образом добавить таблицы SafeSEH в PE-файл после компиляции (например, извлечь необходимую информацию из файла карты или символов отладки), или нам абсолютно необходима поддержка компилятора / компоновщика, и поэтому мы должны подождать, пока Embarcadero реализует эту функцию?
Для ясности, мое приложение - это 32-разрядное приложение для Windows (совместимое с 64-разрядной версией), а не приложение Metro.
2 ответа
Я не могу ответить на вопрос 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
в вашем коде. Хотя это, очевидно, выполнимо, я не думаю, что это поддается решению.
Я скорее предположил, что обработчики исключений SEH для компилятора x86 будут просто _HandleXXX
функции объявлены в System.pas
, В этом случае было бы достаточно легко добавить PE-раздел, в котором перечисляются только эти функции в качестве шага после ссылки. Тем не менее, так как каждый try/except
имеет свой собственный локальный обработчик исключений, теперь я считаю, что только автор компилятора может реально надеяться добавить раздел SafeSEH PE.
Насколько я вижу, нет отчета о контроле качества, который запрашивает SafeSEH
поддержка компилятора Windows x86. Я предлагаю вам зарегистрировать отчет о контроле качества и официальную поддержку.
Обновление: молодец @haimg для успешного завершения, когда мне не удалось найти адрес отчета о контроле качества: QC# 106781.
Существуют и другие факторы, по которым приложение для Delphi не может быть сертифицировано
http://delphitools.info/2012/08/23/why-no-native-winrt-support-in-delphi-xe3/