c++ - 读取应用程序的 list 文件?

标签 c++ windows visual-c++ manifest

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

我在考虑替代数据流的思路?

最佳答案

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

这是一个提取自己的 list 的简单示例...

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

关于c++ - 读取应用程序的 list 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/420852/

相关文章:

c++ - 针对多个字符串数组搜索字符串

c++ - SFML 编译库 GLEW

c++ - 为什么 getcwd() 不符合 ISO C++ 标准?

c++ - 如何跳转到匹配的#if/#elif/#endif 语句?

c++ - 什么是 "Expression SFINAE"?

c++ - 无法在两个函数之间复制值

c# - 作为 MDI 子窗口的程序

python - Windows 不生成 Python 编译文件

c++ - 如何使用 Windows native Wifi 功能连接到请求网络安全 key 的 Wifi?

c++ - 内联 asm 到 x64 - 理解