2009-01-07 9 views

Respuesta

36

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.

He aquí un ejemplo sencillo 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; 
} 

Como alternativa, puede utilizar Mt.exe desde el SDK de Windows:

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

Esto es algo incorrecto (la ayuda es engañosa). Normalmente, .exes tiene un manifiesto incrustado en el recurso # 1, mientras que .dlls tiene el manifiesto en el recurso # 2. En cualquier caso, si no encuentra un recurso manifiesto en el n. ° 1, marque el n. ° 2 en lugar de asumir que no existe. – Wedge

+0

Debe ser argv [1] en el mismo código. – pascal

+0

En realidad estaba leyendo deliberadamente el manifiesto de la aplicación actual: "ejemplo simple que extrae su propio manifiesto". Tu camino también funcionaría ;-) –

9

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

24

se puede extraer/reemplazar/merge/validar los manifiestos de la línea de comandos herramienta de manifiesto, 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: He encontrado la herramienta en C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v6.1 \ bin

+1

'-out: con' a la salida a la consola :) –

2

La forma más fácil de ver/editar los manifiestos en aplicaciones compiladas está utilizando 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.

4

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

1

Trabajar un poco de código de Roger, aquí está el código que utilizo. 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); 
0

solucionar este problema mediante la supresión de la licencia de desarrolladores (*_TemporaryKey.pfx) del proyecto o cambiar nombre de .pfx.

16

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

Screen grab

+0

lol esto también funciona en Linux o bsd con el comando 'menos'. gracias –

+0

Este es un truco muy útil solo para verificar rápidamente lo que hay allí. Gracias – DaveInCaz

0

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

Por lo tanto, si desea comprobar qué manifiesto se utiliza realmente en tiempo de ejecución, debe tenerlo en cuenta.

Cuestiones relacionadas