C ++: доступ к встроенным ресурсам из DLL

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

IDR_TEMPLATE1           RCDATA                "areaTemplate.bin"

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

5

Решение

Первое использование 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, действителен до тех пор, пока модуль
содержащий ресурс выгружается. Не надо разблокировать
ресурсы, потому что система автоматически удаляет их, когда
процесс, который их создал, завершается.

2

Другие решения

Как говорит Мануэлл, вы используете 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));
}
}
3

// 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));
0
По вопросам рекламы [email protected]