FindResource詳解

乘舟凉發表於2024-11-05
#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,但是第三層貌似只會有一個目錄,所以就不用指定了