Может ли приложение Delphi для настольного компьютера быть сертифицировано для Windows 8 (с помощью Windows App Certification Kit)?

По-видимому, Delphi (любая версия) не поддерживает безопасные обработчики исключений (ключ /SAFESEH в Visual Studio). Это приводит к предупреждению при использовании комплекта сертификации приложений для рабочего стола Windows в Windows 8. В соответствии с требованиями сертификации для приложений для настольных компьютеров Windows 8:

Ваше приложение должно быть скомпилировано с использованием флага /SafeSEH, чтобы обеспечить безопасную обработку исключений

Очевидно, Delphi не имеет этого переключателя, поэтому это невозможно сделать. Мои вопросы:

  1. Верно ли мое понимание того, что, хотя комплект отображает только предупреждение (не сбой), поскольку это обязательное требование, любое приложение Delphi сегодня не может быть сертифицировано для Windows 8 и, следовательно, не может быть включено в магазин приложений Windows?

  2. Можно ли каким-то образом добавить таблицы 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/

Другие вопросы по тегам