2013-11-13 6 views
4

У меня есть проект dll C++, в который я встроил некоторые необработанные данные через файл «resource.rc».C++: доступ к встроенному ресурсу из dll

IDR_TEMPLATE1   RCDATA    "areaTemplate.bin" 

Теперь я хочу получить доступ к данным файла "areaTemplate.bin" из dll. Как я могу прочитать содержимое «areaTemplate.bin» в массиве байтов?

ответ

1

Первое использование FindResource или FindResourceEx, затем используйте LoadResource и LockResource.

Используйте SizeofResource чтобы получить информацию по размерам.

Код:

HMODULE g_hModDll; 

[...] 

HRSRC hRscr = FindResource(g_hModDll, MAKEINTRESOURCE(IDR_TEMPLATE1), 
          MAKEINTRESOURCE(RT_RCDATA)); 
if (hRscr) { 
    HGLOBAL hgRscr = LoadResource(g_hModDll, hRscr); 
    if (hgRscr) { 
     PVOID pRscr = LockResource(hgRscr); 
     DWORD cbRscr = SizeofResource(g_hModDll, hRscr); 
    } 
} 

Обязательно прочитайте следующее замечание о LoadResource:

Замечания Тип возврата LoadResource является HGLOBAL для обратной совместимости, а не потому, что функция возвращает обрабатывать глобальный блок памяти . Не передавайте этот дескриптор функции GlobalLock или GlobalFree .

API-интерфейсов «разблокировать ресурсы» или «свободного ресурса» нет.

Примечания Указатель, возвращаемый LockResource действует до модуля , содержащего ресурс выгружается. Нет необходимости разблокировать ресурсы , потому что система автоматически удаляет их при завершении процесса , который их создал.

+0

Сначала это не сработало. После некоторого поиска я обнаружил, что мне нужно инициализировать 'g_hModDll', используя' GetModuleHandle (L "mydll.dll") '. Есть ли способ перечислить «L» mydll.dll «', а не жестко кодировать его в программе? – asif

+1

Если «mydll.dll» является обычной библиотекой Win32 C/C++, вы можете сохранить значение HMODULE (HINSTANCE) в DllMain. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583.aspx. Дайте мне знать, если вам нужна дополнительная помощь. – manuell

3

Как говорит Manuell, вы используете FindResource(), LoadResource() и, вероятно, LockResource() и SizeofResource()

Я случайно есть некоторый код, который делает вытаскивает ресурс и записывает его в файл, и может помочь с пониманием API, о котором идет речь.

void WriteResourceToFile(
    HANDLE hFile, 
    const _tstring &resourceName, 
    const _tstring &resourceType, 
    HMODULE hModule) 
{ 
    HRSRC hResource = ::FindResource(
     hModule, 
     resourceName.c_str(), 
     resourceType.c_str()); 

    if (!hResource) 
    { 
     const DWORD lastError = ::GetLastError(); 

     throw CWin32Exception(
     _T("WriteResourceToFile() - FindResource"), 
     lastError); 
    } 

    HGLOBAL hGlobal = ::LoadResource(hModule, hResource); 

    if (!hGlobal) 
    { 
     const DWORD lastError = ::GetLastError(); 

     throw CWin32Exception(
     _T("WriteResourceToFile() - LoadResource"), 
     lastError); 
    } 

    void *pData = ::LockResource(hGlobal); 

    if (!pData) 
    { 
     const DWORD lastError = ::GetLastError(); 

     throw CWin32Exception(
     _T("WriteResourceToFile() - LockResource"), 
     lastError); 
    } 

    const DWORD bytes = ::SizeofResource(hModule, hResource); 

    DWORD bytesWritten = 0; 

    if (!::WriteFile(hFile, pData, bytes, &bytesWritten, 0)) 
    { 
     const DWORD lastError = ::GetLastError(); 

     throw CWin32Exception(
     _T("WriteResourceToFile() - WriteFile"), 
     lastError); 
    } 

    if (bytesWritten != bytes) 
    { 
     throw CWin32Exception(
     _T("WriteResourceToFile() - WriteFile"), 
     _T("Wrote less bytes (") + ToString(bytesWritten) + 
     _T("(than expected: ") + ToString(bytes)); 
    } 
} 
0
// Determine the module handle of your DLL by locating a function 
// you know resides in that DLL 
HMODULE hModule; 
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, 
     (LPCSTR)&myDLLfuncName, &hModule) 

HRSRC hRscr = FindResource(hModule, MAKEINTRESOURCE(IDR_TEMPLATE1), 
          MAKEINTRESOURCE(RT_RCDATA)); 
Смежные вопросы