#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,但是第三層貌似只會有一個目錄,所以就不用指定了