#include <iostream>
#include <Windows.h>int main() {// 获取当前模块的句柄HMODULE hModule = GetModuleHandle(NULL);HRSRC hRes = ::FindResource(hModule, MAKEINTRESOURCE(1), RT_MANIFEST);if (hRes == NULL) {std::cerr << "无法找到清单文件资源。" << std::endl;return 1;}// 加载资源到内存中HGLOBAL hResLoad = LoadResource(hModule, hRes);if (hResLoad == NULL) {std::cerr << "无法加载清单文件资源。" << std::endl;return 1;}// 锁定资源,获取资源数据的指针LPVOID pResLock = LockResource(hResLoad);if (pResLock == NULL) {std::cerr << "无法锁定清单文件资源。" << std::endl;return 1;}// 获取资源的大小DWORD resSize = SizeofResource(hModule, hRes);if (resSize == 0) {std::cerr << "无法获取清单文件资源大小。" << std::endl;return 1;}// 将清单文件内容打印到控制台std::cout.write(static_cast<const char*>(pResLock), resSize);return 0;
}
上面的代码是获取可执行程序的清单并打印,下面结合资源结构分析
HRSRC hRes = ::FindResource(hModule, MAKEINTRESOURCE(1), RT_MANIFEST);
看到只需要两层标识就可以定位到想要的资源
第一层 资源的类型
RT_MANIFEST
就是ID号24
第二层 资源的名称或ID号
MAKEINTRESOURCE(1)
,这里是ID: 1
可以看到资源结构中还有第三层,ID:1033,但是第三层貌似只会有一个目录,所以就不用指定了