tools kit certification app delphi windows-8 app-certification-kit wack

delphi - kit - sdk tools windows 10



¿Puede una aplicación Delphi de escritorio certificarse para Windows 8(con el Kit de certificación de aplicaciones de Windows)? (2)

Aparentemente, Delphi (cualquier versión) no es compatible con los manejadores de excepciones seguros (/ SAFESEH cambiar en Visual Studio). Esto genera una advertencia cuando se utiliza el Kit de certificación de la aplicación Windows Desktop en Windows 8. Según los requisitos de certificación para las aplicaciones de escritorio de Windows 8:

Su aplicación debe compilarse usando el indicador / SafeSEH para garantizar el manejo seguro de excepciones

Obviamente, Delphi carece de este interruptor, por lo que no se puede hacer. Mis preguntas son:

  1. ¿Es correcto mi entendimiento de que, aunque el Kit muestra solo una advertencia (no falla), ya que este es un requisito "obligatorio", cualquier aplicación Delphi hoy en día no puede ser certificada para Windows 8 y por lo tanto no puede ser incluida en la tienda de aplicaciones de Windows?

  2. ¿Pueden tablas SafeSEH agregarse a un archivo PE después de la compilación de alguna manera (por ejemplo, extrayendo información necesaria del archivo de mapa o símbolos de depuración), o necesitamos absolutamente un compilador / enlazador para esto, y por lo tanto debemos esperar hasta que Embarcadero implemente esta característica?

Para borrar, mi aplicación es la aplicación de escritorio de Windows de 32 bits (compatible con 64 bits), no la aplicación de Metro .



No puedo responder la pregunta 1. Sin embargo, me resulta difícil imaginar que el uso de la palabra debe significar que la regla es opcional.

En cuanto a la pregunta 2, necesitaría el soporte del compilador / vinculador. No puede razonablemente esperar volver a encajar esto con una herramienta de post-enlace de edición de PE. Considera el siguiente código:

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

El compilador emite lo siguiente:

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); ........

Ahora, el manejador de excepciones real es HandleOnException , implementado en System.pas . Pero, la dirección introducida en la pila es $0041c3c9 , una dirección local del código que contiene el bloque try/except . Esto significa que para crear una sección de SafeSEH PE necesitarás ubicar todas y cada una de las try/except en tu código. Aunque eso es obviamente factible, no creo que sea manejable.

Prefiero imaginar que los manejadores de excepciones SEH para el compilador x86 serían solo las funciones _HandleXXX declaradas en System.pas . En ese caso, sería bastante fácil agregar una sección PE que enumere solo esas funciones como un paso posterior al enlace. Sin embargo, dado que cada try/except individual try/except tiene su propio manejador local de excepciones, ahora creo que solo el autor del compilador puede realmente esperar agregar la sección SafeSEH PE.

No hay, hasta donde puedo ver, ningún informe de SafeSEH calidad que solicite el soporte de SafeSEH para el compilador x86 de Windows. Sugiero que registre un informe de control de calidad y un caso de soporte oficial.

Actualización: Bien hecho a @haimg por tener éxito donde fallé y logré ubicar un informe de control de calidad: QC#106781 .