2009-01-07 11 views

Répondre

36

Les fichiers manifestes Windows sont des ressources Win32. En d'autres termes, ils sont intégrés vers la fin de l'EXE ou de la DLL. Vous pouvez utiliser LoadLibraryEx, FindResource, LoadResource et LockResource pour charger la ressource incorporée.

Voici un exemple simple qui extrait son propre manifeste ...

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; 
} 

Vous pouvez également utiliser mt.exe à partir du Windows SDK:

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

Ceci est quelque peu incorrect (l'aide est trompeuse). Généralement .exes ont un manifeste incorporé dans la ressource n ° 1, tandis que .dlls ont le manifeste dans la ressource n ° 2. Dans tous les cas, si vous ne trouvez pas de ressource manifeste dans # 1, vérifiez # 2 plutôt que de supposer qu'elle n'existe pas. – Wedge

+0

Il devrait être argv [1] dans le même code. – pascal

+0

En fait, je lisais délibérément le manifeste de l'application actuelle: "exemple simple qui extrait son propre manifeste". Votre chemin fonctionnerait aussi ;-) –

9

Il existe un outil de visualisation manifeste disponible here - Je ne sais pas si l'auteur rendra le code source disponible.

24

Vous pouvez extraire/remplacer/fusion/valider les manifestes en utilisant la ligne de commande outil manifeste, mt.exe, qui fait partie des Windows SDK:

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: Je trouve l'outil dans C: \ Program Files \ Microsoft SDKs \ Windows \ v6.1 \ bin

+1

'-out: con' à la sortie à la console :) –

2

La meilleure façon de visualiser/modifier dans les applications compilées se manifeste utilise Resource Tuner: http://www.restuner.com/tour-manifest.htm

Dans certains cas, il est plus robuste que mt.exe de MS, et c'est un outil visuel.

4

Resource Tuner serait bien s'il prenait en charge le code x64, mais à ce jour, il est toujours réservé aux applications 32 bits. Resource Hacker (le plus récent de la version bêta publique) prend en charge x86 et x64 qui est disponible ici: http://angusj.com/resourcehacker/

1

Travailler un peu de code de Roger, voici le code que j'utilise. Il suppose que le manifeste est à l'id # 1. Je suppose que c'est la valeur par défaut pour .exe. Voir le commentaire de Wedge, vous devrez peut-être également vérifier l'ID n ° 2 si vous travaillez avec 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

Résoudre ce problème en supprimant la licence de développeurs (*_TemporaryKey.pfx) du projet ou changer Nom de .pfx.

16

Ouvrez le fichier dans le bloc-notes. La chose est en texte brut.

Screen grab

+0

lol cela fonctionne aussi dans linux ou bsd avec la commande 'less'. merci –

+0

Ceci est une astuce très utile juste pour vérifier rapidement ce qu'il y a dedans. Merci – DaveInCaz

0

Pour rappel latéral: rappelez-vous que les manifestes peuvent également être des fichiers autonomes avec le même nom que l'application (prolongée par « .manifest »). Par conséquent, si vous voulez vérifier quel manifeste est réellement utilisé au moment de l'exécution, cela doit être pris en compte.