c++ windows visual-c++ manifest

c++ - leyendo el archivo de manifiesto de una aplicación?



windows visual-c++ (9)

¿Hay una manera fácil de leer el archivo de manifiesto ya incorporado de una aplicación?

Estaba pensando en las líneas de una secuencia de datos alternativa?


Abra el archivo en el Bloc de notas. La cosa está en texto plano.


Como recordatorio lateral: recuerde que los manifiestos también pueden ser archivos independientes con el mismo nombre que la aplicación (extendido por ".manifest").

Por lo tanto, si desea verificar qué manifiesto realmente se usa en tiempo de ejecución, esto debe tenerse en cuenta.


El sintonizador de recursos sería bueno si admitía el código x64, pero a partir de hoy sigue siendo solo para aplicaciones de 32 bits. Resource Hacker (la beta pública más nueva) es compatible con x86 y x64, que está disponible desde aquí: http://angusj.com/resourcehacker/


Hay una herramienta de visor de manifiesto disponible here . No sé si el autor hará que el código fuente esté disponible.


La forma más fácil de ver / editar manifiestos en aplicaciones compiladas es usar Resource Tuner: http://www.restuner.com/tour-manifest.htm

En algunos casos, es más robusto que mt.exe de MS, y es una herramienta visual.


Los archivos de manifiesto de Windows son recursos de Win32. En otras palabras, están incrustados hacia el final del EXE o DLL. Puede usar LoadLibraryEx, FindResource, LoadResource y LockResource para cargar el recurso incrustado.

Aquí hay un ejemplo simple que extrae su propio manifiesto ...

BOOL CALLBACK EnumResourceNameCallback(HMODULE hModule, LPCTSTR lpType, LPWSTR lpName, LONG_PTR lParam) { HRSRC hResInfo = FindResource(hModule, lpName, lpType); DWORD cbResource = SizeofResource(hModule, hResInfo); HGLOBAL hResData = LoadResource(hModule, hResInfo); const BYTE *pResource = (const BYTE *)LockResource(hResData); TCHAR filename[MAX_PATH]; if (IS_INTRESOURCE(lpName)) _stprintf_s(filename, _T("#%d.manifest"), lpName); else _stprintf_s(filename, _T("%s.manifest"), lpName); FILE *f = _tfopen(filename, _T("wb")); fwrite(pResource, cbResource, 1, f); fclose(f); UnlockResource(hResData); FreeResource(hResData); return TRUE; // Keep going } int _tmain(int argc, _TCHAR* argv[]) { const TCHAR *pszFileName = argv[0]; HMODULE hModule = LoadLibraryEx(pszFileName, NULL, LOAD_LIBRARY_AS_DATAFILE); EnumResourceNames(hModule, RT_MANIFEST, EnumResourceNameCallback, NULL); FreeLibrary(hModule); return 0; }

Alternativamente, puede usar MT.EXE desde el SDK de Windows:

>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest


Puede extraer / reemplazar / fusionar / validar manifiestos utilizando la herramienta de manifiesto de línea de comandos, mt.exe , que es parte del SDK de Windows:

C:/Program Files/Microsoft SDKs/Windows/v6.1>mt /? Microsoft (R) Manifest Tool version 5.2.3790.2075 ... > To extract manifest out of a dll: mt.exe -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest

EDIT: encontré la herramienta en C: / Program Files / Microsoft SDKs / Windows / v6.1 / bin


Solucione este problema eliminando la licencia de desarrollador ( *_TemporaryKey.pfx ) del proyecto o cambie el nombre de .pfx.


Trabajando un poco con el código de Roger, aquí está el código que uso. Supone que el Manifiesto está en id # 1. Supongo que este es el valor predeterminado para .exe. Vea el comentario de Wedge, es posible que también deba verificar la Id. N.º 2 si está trabajando con DLL.

HMODULE module = ::LoadLibraryEx(pathname, NULL, LOAD_LIBRARY_AS_DATAFILE); if (module == NULL) return false; HRSRC resInfo = ::FindResource(module, MAKEINTRESOURCE(1), RT_MANIFEST); // resource id #1 should be the manifest if (resInfo) { HGLOBAL resData = ::LoadResource(module, resInfo); DWORD resSize = ::SizeofResource(module, resInfo); if (resData && resSize) { const char *res = (const char *)::LockResource(resData); // the manifest if (res) { // got the manifest } ::UnlockResource(resData); } ::FreeResource(resData); } ::FreeLibrary(module);