FindResource详解
#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,但是第三层貌似只会有一个目录,所以就不用指定了