Existe-t-il un moyen simple de lire le fichier manifeste déjà incorporé d'une application?
Je pensais dans le sens d'un flux de données alternatif?
Les fichiers de manifeste Windows sont des ressources Win32. En d'autres termes, ils sont incorporé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 SDK Windows:
>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
Vous pouvez extraire/remplacer/fusionner/valider des manifestes à l'aide de l'outil de manifeste de ligne de commande, mt.exe
, qui fait partie du 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: j'ai trouvé l'outil dans C:\Program Files\Microsoft SDK\Windows\v6.1\bin
Ouvrez le fichier dans le Bloc-notes. La chose est en texte brut.
Un outil de visualisation des manifestes est disponible ici - Je ne sais pas si l'auteur rendra le code source disponible.
Resource Tuner serait bien s'il prenait en charge le code x64, mais à ce jour, il reste réservé aux applications 32 bits. Resource Hacker (la dernière version bêta publique) prend en charge les formats x86 et x64, disponibles à partir d'ici: http://angusj.com/resourcehacker/
Le moyen le plus simple de visualiser/modifier les manifestes dans les applications compilées est d'utiliser Resource Tuner: http://www.restuner.com/tour-manifest.htm
Dans certains cas, il est plus robuste que mt.exe de MS et constitue un outil visuel.
Travaillant un peu à partir du code de Roger, voici le code que j'utilise. Il suppose que le manifeste est à l’identité n ° 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 une 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);
Pour rappel, rappelez-vous que les manifestes peuvent également être des fichiers autonomes portant le même nom que l'application (étendue de ".manifest").
Donc, si vous voulez savoir quel manifeste est vraiment utilisé au moment de l'exécution, vous devez en tenir compte.
Résolvez ce problème en supprimant la licence de développeur (*_TemporaryKey.pfx
) du projet ou en modifiant le nom du fichier .pfx.