2013-05-13 40 views
1

這裏C#同樣的問題:load resource as byte array programmaticaly加載資源作爲字節數組programmaticaly在C++

所以我有一個資源(只是二進制文件 - 用戶數據這麼想的真正的問題)。我需要獲得一個指向表示這個資源的字節數組的指針,該怎麼做?位於vs2010(win32控制檯項目)的資源文件中的資源。我想我需要使用winapi的FindResource,LoadResourceLockResource函數。

+0

在Visual Studio中,您可以添加資源文件 – 2013-05-13 17:43:43

+3

問:我想我需要使用FindResource,LoadResource和LockResource? A:是的。確切地說:[如何在VC++靜態庫中加載自定義二進制資源作爲DLL的一部分?](http://stackoverflow.com/questions/9240188/how-to-load-a-custom-binary-resource-in -a -vc-static-library-as-part-of-dll) – paulsm4 2013-05-13 17:46:23

回答

5

要獲取資源的字節信息,第一步是使用FindResourceFindResourceEx獲取資源的句柄。然後,使用 LoadResource加載資源。最後,使用LockResource來獲取數據的地址,並從該點訪問SizeofResource字節。下面的例子說明了這個過程:

HMODULE hModule = GetModuleHandle(NULL); // get the handle to the current module (the executable file) 
HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(RESOURCE_ID), RESOURCE_TYPE); // substitute RESOURCE_ID and RESOURCE_TYPE. 
HGLOBAL hMemory = LoadResource(hModule, hResource); 
DWORD dwSize = SizeofResource(hModule, hResource); 
LPVOID lpAddress = LockResource(hMemory); 

char *bytes = new char[dwSize]; 
memcpy(bytes, lpAddress, dwSize); 

錯誤處理過程不再贅述,你應該檢查每個調用的返回值。

+1

'GetModuleHandle(NULL); //獲取當前模塊的句柄「 - 這不是API返回的。它返回用於創建過程的模塊的句柄。當資源被編譯到DLL中時(這是一種常見的情況,特別是在本地化方面),這會失敗。在[從靜態庫訪問當前模塊的HINSTANCE]下概述了一種解決方案(https://blogs.msdn.microsoft.com/oldnewthing/20041025-00/?p=37483)。 – IInspectable 2016-05-30 14:00:53