有没有简单的方法来读取应用程序已经embedded的清单文件?
我正在考虑一个备用数据stream的线?
Windows清单文件是Win32资源。 换句话说,它们嵌入到EXE或DLL的末尾。 您可以使用LoadLibraryEx,FindResource,LoadResource和LockResource来加载嵌入式资源。
这是一个简单的例子,提取自己的清单…
BOOL CALLBACK EnumResourceNameCallback(HMODULE hmodulee, LPCTSTR lpType, LPWSTR lpName, LONG_PTR lParam) { HRSRC hResInfo = FindResource(hmodulee, lpName, lpType); DWORD cbResource = SizeofResource(hmodulee, hResInfo); HGLOBAL hResData = LoadResource(hmodulee, 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 hmodulee = LoadLibraryEx(pszFileName, NULL, LOAD_LIBRARY_AS_DATAFILE); EnumResourceNames(hmodulee, RT_MANIFEST, EnumResourceNameCallback, NULL); FreeLibrary(hmodulee); return 0; }
或者,您可以使用Windows SDK中的MT.EXE:
>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
您可以使用命令行清单工具mt.exe
(它是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
编辑:我在C:\ Program Files \ Microsoft SDKs \ Windows \ v6.1 \ bin中找到该工具
在记事本中打开文件。 事情是纯文本的。
这里有一个清单的查看器工具 – 我不知道作者是否会提供源代码。
如果资源调谐器支持x64代码,那么资源调谐器将会很好,但到今天为止,它仍然只适用于32位应用程序。 资源黑客(最新的公共测试版)不支持x86和x64这是可从这里: http : //angusj.com/resourcehacker/
在编译的应用程序中查看/编辑清单最简单的方法是使用资源调谐器: http : //www.restuner.com/tour-manifest.htm
在某些情况下,它比MS的mt.exe更健壮,它是一个可视化工具。
从罗杰的代码工作了一下,这里是我使用的代码。 它假定Manifest在ID#1。 我想这是.exe的默认值。 请参阅Wedge的注释,如果您使用的是DLL,则可能还需要检查id#2。
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);
通过从项目中删除开发人员许可证( *_TemporaryKey.pfx
)或更改.pfx的名称来解决此问题。
作为一个提醒:记住清单也可以是与应用程序同名的独立文件(由“.manifest”扩展)。
所以如果你想查看哪个清单是在运行时真正使用的,那么必须考虑到这一点。