Recientemente he pasado por un montón de aplicaciones de utilidad independientes escritas en VB6 para asegurarme de que la virtualización de registro esté desactivada para Windows Vista y superior. Creé un archivo de manifiesto independiente para cada exe, establecí el requestedExecutionLevel
de forma adecuada (algunos de ellos necesitan modificar las claves de registro HKEY_LOCAL_MACHINE
, otros no) y los probé. Todos parecen funcionar correctamente.Incrustar un manifiesto de aplicación en un exe VB6
Me queda solo un pequeño problema. Dado que son utilidades independientes, las personas están acostumbradas a copiarlas por la red y ejecutarlas manualmente. Si alguien olvida copiar el archivo de manifiesto así como el exe, el exe escribirá de forma silenciosa en la clave de registro virtualizada en lugar de la real y causará problemas difíciles de solucionar.
La solución obvia es incorporar el manifiesto en el exe como recurso. Todos los artículos que he leído en la red le dicen incrustar el recurso de la siguiente manera:
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "app.manifest"
Esto debería funcionar bien, excepto que el compilador de VB siempre crea el icono de la aplicación con el ID de recurso = 1. Cuando probé el código anterior, Windows se negó a ejecutar el exe, quejándose de un error de recurso (actualizaré esta publicación con los detalles más adelante). Traté de cambiar el ID del recurso a otro número, luego de lo cual Windows ejecutó el programa con éxito pero no reconoció el contenido del manifiesto.
¿Alguien sabe de una manera de hacer funcionar un manifiesto incrustado en un exe VB6, o debería simplemente seguir con un archivo externo?
ACTUALIZA 1
El texto anterior es dado todo el contenido del archivo .rc
. Compilo en un archivo .res
así:
"%ProgramFiles%\Microsoft Visual Studio\VB98\Wizards\rc.exe" /r /fo "Resources.res" "Resources.rc"
e incrustarlo en el archivo de proyecto de VB6 así:
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\..\WINDOWS\system32\stdole2.tlb#OLE Automation
Form=Main.frm
ResFile32="Resources.res"
IconForm="FMain"
Startup="FMain"
HelpFile=""
Title="Windows Vista Registry Test - VB6"
ExeName32="RegistryTestVB6.exe"
Path32=""
Command32=""
Name="RegistryTestVB6"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionComments="Windows Vista Registry Test - VB6"
VersionCompanyName=""
VersionFileDescription="Windows Vista Registry Test - VB6"
VersionLegalCopyright=""
VersionProductName="Windows Vista Registry Test - VB6"
CondComp=""
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
Cuando leí el compilado exe en el editor de recursos VS2008, se se parece a esto:
RegistryTestVB6.exe
Icon
1 [Neutral]
RT_MANIFEST
1 [English (United States)]
Version
1 [English (United States)]
Cuando construyo una aplicación VB.NET prueba equivalente exacto en VS2008, a continuación, cargar en el que edito de recursos r, parece que esta vez:
RegistryTestNET.exe
Icon
32512 [Neutral]
RT_MANIFEST
1 [Neutral]
Version
1 [Neutral]
ACTUALIZACIÓN 2
de prueba - el exe .NET funciona muy bien tanto en Windows XP y Windows 7. Sin embargo, el exe VB6 produce el siguiente error en XP :
Esta aplicación no se ha podido iniciar porque la configuración de la aplicación es incorrecta. Reinstalar la aplicación podría resolver el problema.
y el siguiente error en 7:
La aplicación no pudo iniciar porque su configuración lado a lado es incorrecta. Consulte el registro de eventos de la aplicación o use la herramienta de línea de comandos sxstrace.exe para obtener más detalles.
Mirando en el evento de registro veo la siguiente entrada:
generar el contexto de activación falló para "RegistryTestVB6.exe". Error en el archivo de manifiesto o de política "RegistryTestVB6.exe" en la línea 10. Sintaxis Xml no válida.
Huelga decir que el XML no es inválido, es exactamente el mismo archivo con la misma codificación que utilicé para .NET exe, y eso funciona.
RESOLUCIÓN
El compilador de VB6 en efecto, se requiere que el texto arbitrario incluido en un recurso debe ser un múltiplo exacto de 4 bytes. Simplemente agregué espacios al XML hasta que Notepad ++ me dijo que el tamaño total del archivo, incluida la lista de materiales, era un múltiplo de 4.
Gracias a Michael y a Jim por señalarme en la dirección correcta. Es una lástima que no pueda marcarlos a ambos como la respuesta!
No estoy seguro de cuál es tu problema, pero no es el ícono. cada clase de recurso (RT_MANIFEST, RT_ICON) tiene su propio espacio de nombre de identificación. ¿Puedes darnos más del texto del archivo .rc? –
Recuerdo vagamente algo sobre XP y Vista que desean el manifiesto en diferentes identificadores de recursos. intente usar RESOURCE_ID 2, o posiblemente ponga el mismo manifiesto en ID 1 e ID 2. –
@JohnKnoeller Los ID de recursos en realidad tienen un significado y pueden producir resultados diferentes, consulte [aquí] (http://blogs.msdn.com/b /junfeng/archive/2007/06/26/rt-manifest-resource-and-isolation-aware-enabled.aspx) para más detalles. – takrl