代码之家  ›  专栏  ›  技术社区  ›  Brian R. Bondy

正在读取应用程序的清单文件?

  •  33
  • Brian R. Bondy  · 技术社区  · 15 年前

    有没有一种简单的方法可以读取应用程序已经嵌入的清单文件?

    9 回复  |  直到 15 年前
        1
  •  47
  •   Roger Lipscombe    15 年前

    Windows清单文件是Win32资源。换句话说,它们嵌入到EXE或DLL的末尾。您可以使用LoadLibraryEx、FindResource、LoadResource和LockResource加载嵌入式资源。

    下面是一个简单的示例,它提取自己的清单。。。

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

    或者,您可以从Windows SDK使用MT.EXE:

    >mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
    
        2
  •  33
  •   Rand Random    4 年前

    您可以使用命令行清单工具提取/替换/合并/验证清单, 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:\ProgramFiles(x86)\Windows Kits\10\bin\10.0.18362.0\x86
        3
  •  28
  •   Daedalus Jhilom    11 年前

    Screen grab

        4
  •  11
  •   jeffm    15 年前

    有一个清单查看器工具可用 here

        5
  •  4
  •   mike    14 年前

    如果资源调谐器支持x64代码,那就更好了,但到今天为止,它仍然只适用于32位应用程序。Resource Hacker(最新的公测版)确实支持x86和x64,可从以下位置获得: http://angusj.com/resourcehacker/

        6
  •  2
  •   Wylder    15 年前

    查看/编辑已编译应用程序中的清单的最简单方法是使用资源调谐器: http://www.restuner.com/tour-manifest.htm

    在某些情况下,它比MS中的mt.exe更健壮,并且是一种可视化工具。

        7
  •  1
  •   Samphan    13 年前

    根据罗杰的代码,这里是我使用的代码。它假设清单位于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);
    
        8
  •  0
  •   Ivan Ferić    11 年前

    通过删除开发者许可证修复此问题( *_TemporaryKey.pfx )从项目中删除或更改.pfx的名称。

        9
  •  0
  •   chksr    8 年前

    附带提醒:请记住,清单也可以是与应用程序同名的独立文件(扩展名为“.manifest”)。