除了對話框、選單、位圖等標準資源類型,VC++ 支援 自訂資源 (Custom Resource),可將任意二進位檔案 (ZIP、DLL、AVI、加密資料…) 直接嵌入 EXE/DLL,執行時從資源載入釋放,適用於:
MYTYPE)。skin.zip)。IDR_MYTYPE1),類型顯示為 MYTYPE。// 1. 定位資源
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDR_MYTYPE1), _T("MYTYPE"));
if (!hRsrc) return FALSE;
// 2. 取得資源大小
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (!dwSize) return FALSE;
// 3. 載入資源到記憶體
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if (!hGlobal) return FALSE;
// 4. 鎖定取得資料指標
LPVOID pBuffer = LockResource(hGlobal);
if (!pBuffer) return FALSE;
// 5. 使用資料 (寫入檔案/記憶體載入 DLL/解壓縮...)
FILE* fp = _tfopen(_T("released.bin"), _T("wb"));
if (fp) {
fwrite(pBuffer, 1, dwSize, fp);
fclose(fp);
}
// 6. Win32 下無需 UnlockResource/FreeResource (16-bit 遺留 API,系統自動回收)
return TRUE;
BOOL UseCustomResource()
{
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(ITEMID), TEXT("MyType"));
if (!hRsrc) return FALSE;
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (!dwSize) return FALSE;
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if (!hGlobal) return FALSE;
LPVOID pBuffer = LockResource(hGlobal);
if (!pBuffer) return FALSE;
BOOL bRt = FALSE;
FILE* fp = _tfopen(_T("demo.exe"), _T("wb"));
if (fp) {
if (dwSize == fwrite(pBuffer, 1, dwSize, fp)) bRt = TRUE;
fclose(fp);
}
return bRt;
}
專案嵌入兩項自訂資源:
HELLO_EXE (類型 EMBED_EXE):一個 Win32 Hello World 程式PROJECT_ZIP (類型 EMBED_ZIP):整個專案原始碼壓縮包介面提供 [Release] 釋放 Hello World、[Unzip] 解壓專案原始碼 (需配合 zlib/miniz 等解壓庫)。
// 釋放到暫存檔再 LoadLibrary (簡單但需寫磁碟)
WriteResourceToTempFile(IDR_MYDLL, "MYDLL", _T("mylib.dll"));
HMODULE hMod = LoadLibrary(_T("mylib.dll"));
// 純記憶體載入 (需手動解析 PE 結構,或使用開源 MemoryModule)
HMODULE hMod = MemoryLoadLibrary(pBuffer, dwSize);
完整原始碼 (WinXP + VC.NET 2003 + WTL 7.5 編譯通過) 可下載參考。