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

上面的代码是获取可执行程序的清单并打印,下面结合资源结构分析

d4370b42e5d26aec5e38a1478d7ec563

HRSRC hRes = ::FindResource(hModule, MAKEINTRESOURCE(1), RT_MANIFEST);

看到只需要两层标识就可以定位到想要的资源

第一层 资源的类型

296f1fc88c9781d79b55441ff5552497
RT_MANIFEST就是ID号24

第二层 资源的名称或ID号

MAKEINTRESOURCE(1),这里是ID: 1

可以看到资源结构中还有第三层,ID:1033,但是第三层貌似只会有一个目录,所以就不用指定了

posted @ 2024-11-05 00:40  乘舟凉  阅读(28)  评论(0编辑  收藏  举报