2010-04-06 9 views
5

Mi última pregunta "Listar el estado del servicio y los servicios en Win-7" me hizo comenzar a trabajar en una solución que da a mi aplicación los privilegios de administrador bajo Windows Vista basados ​​en un archivo .manifest .Problemas del archivo de manifiesto de la aplicación Delphi en WinXP y Win7

yo no estaba seguro de continuar con la pregunta anterior con este asunto ya que no son lo mismo, así que aquí es otra pregunta: ¿

Mi aplicación funciona bien en Win 7 si es o no lo ejecuto "como administrador" debido al archivo manifiesto Mi archivo de manifiesto es el siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.6.0.5" processorArchitecture="X86" name="ServiceMonitorPro" type="win32"/> 
    <description publisher="Powershield Ltd" product="Powershield Service Monitor">Powershield Service Monitor</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
    <requestedPrivileges> 
    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
    </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

Cuando la aplicación se ejecuta en Windows 7 o Vista, el UAC viene con un diálogo como este: alt text http://www.freeimagehosting.net/uploads/39787fd3dd.jpg

¿Cómo puedo reemplazar el editor "desconocido"?

El otro y más grande problema es que, aunque la aplicación se ejecute sin problemas bajo Win7 o Vista, bajo WinXP ahora se bloquea con el mensaje: "Esta aplicación no se pudo iniciar porque la configuración de la aplicación es incorrecta. la aplicación puede solucionar este problema ".

Otra cosa que me gustaría añadir: Si agrego referencia (utiliza la cláusula) a XPMan la aplicación funciona bien en WinXP, pero luego que mi archivo manifest no hace ninguna diference en Vista o Win7.

Respuesta

12

Tengo que agradecer a todos los que, con comentarios o respuestas me indican que sigo excavando ... :) Fui a buscar el archivo WindowsXP.res. El contenido de ese archivo es:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity 
    type="win32" 
    name="DelphiApplication" 
    version="1.0.0.0" 
    processorArchitecture="*"/> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
     type="win32" 
     name="Microsoft.Windows.Common-Controls" 
     version="6.0.0.0" 
     publicKeyToken="6595b64144ccf1df" 
     language="*" 
     processorArchitecture="*"/> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

La solución: he mezclado mi archivo manifest con la adición de la WindowsXP.Res xml sección dependencia. Si alguien sabe por qué está funcionando ahora, me alegraría saber de esto, pero esta fue la solución aquí, probado hasta ahora en un par de máquinas virtuales, en mi computadora y un par de otras ... funcionando :)

+0

¡Impresionante! Gracias por publicar la solución aquí. Creo que hay una buena placa para eso, si se sube lo suficiente. –

8

Tiene que firmar su código con un certificado de firma de código. Debería haber muchos ejemplos aquí. He vuelto a etiquetar su pregunta con "firma de código", y también puede buscar "certificado".
Uso los certificadores de Comodo yo mismo, y los firmo con el impresionante y maravilloso Visual Build Pro v6, que es un anunciante aquí en SO.

+0

Hola, OK - comprobará esto, gracias - ¿alguna idea con el otro problema? – ronaldosantana

+0

Lo siento, no he visto ese otro. –

+1

@Ronaldo: El otro mensaje de error tiene que ver con la llamada "configuración lado a lado". En términos simples, espera encontrar alguna biblioteca en tiempo de ejecución, pero no puede. Se ve con relativa frecuencia para las aplicaciones de VC++ creadas con compiladores recientes. Sin embargo, eso normalmente no sería un problema para las aplicaciones de Delphi. ¿Estás dependiendo de algunas DLL externas? ¿Ha comprobado que en realidad están disponibles en XP, o si deben instalarse por separado? Si necesitan ser instalados, ¿realmente recuerda instalarlos? (Oye, nunca se sabe ...) –

3

Puede indicar compatibilidad con varias versiones de Windows en su manifiesto también. Sé que hay entradas para la compatibilidad con Vista y Win7; no estoy seguro acerca de XP.

La información sobre la sección de compatibilidad de manifiesto está disponible en MSDN.Esto puede ayudar, también - desde la página enlazada:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
<application> 
<!--The ID below indicates application support for Windows Vista --> 
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
<!--The ID below indicates application support for Windows 7 --> 
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> 
</application> 
</compatibility> 
1

En las nuevas versiones de Delphi (7 y anteriores creo) también es necesario también asegúrese de desactivar la opción "Temas Uso de tiempo de ejecución" en las opciones de proyecto diálogo, de lo contrario Delphi se vinculará automáticamente en su propio archivo de manifiesto predeterminado (así es como habilita el "soporte de tema") y obtendrá un error de tiempo de ejecución acerca de la configuración de la aplicación que es incorrecta, porque habrá entradas en conflicto.

Aquí es un archivo de manifiesto completo para una aplicación Delphi2007 que necesita para funcionar en modo adminstrator en Windows 7, y también incluye la sección "dependencia" para habilitar el soporte tema de tiempo de ejecución:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
     <assemblyIdentity 
     type="win32" 
     name="CodeGear RAD Studio" 
     version="11.0.2902.10471" 
     processorArchitecture="*"/> 
     <dependency> 
     <dependentAssembly> 
      <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" 
      processorArchitecture="*"/> 
     </dependentAssembly> 
     </dependency> 
     <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <security> 
      <requestedPrivileges> 
      <requestedExecutionLevel 
       level="requireAdministrator" 
       uiAccess="false"/> 
      </requestedPrivileges> 
     </security> 
     </trustInfo> 
    </assembly> 
Cuestiones relacionadas