Функция FindResource () не работает, хотя ресурс существует

Я пытаюсь использовать функцию Win32 FindResource () для загрузки встроенного ресурса в буфер.
Я добавляю время компиляции ресурса в Visual Studio 2015 IDE:

введите описание изображения здесь

Как вы можете видеть, используя PE-редактор, такой как CFFexplorer или ResHacker, ресурс добавляется правильно:
введите описание изображения здесь

Проблема возникает, когда я пытаюсь использовать функцию FindResource (), чтобы загрузить ее во время выполнения, в начале проекта DLL:

  INT WINAPI DllMain( HINSTANCE hInstDLL, DWORD dwReason, LPVOID lpReserved )
{
HRSRC ResLocation = 0;

switch( dwReason )
{
case DLL_PROCESS_ATTACH:

// Show debug console
AllocConsole();
freopen("CONOUT$", "w", stdout);

//Locate our resource
ResLocation = FindResource(hInstDLL, "RESFILE", "RESFILE");

// FindResource returns NULL with error 1813: ERROR_RESOURCE_TYPE_NOT_FOUND
printf("TEST RESULT: reslocation: %i error %i\n", ResLocation, GetLastError());

StartProc();
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}

FindResource возвращает NULL с ошибкой 1813: ERROR_RESOURCE_TYPE_NOT_FOUND.
Есть идеи, почему не удается загрузить ресурс?
Спасибо

0

Решение

FindResource () / LoadResource () — это AFAIK не для поиска / загрузки всего «файла» ресурса (на самом деле такого файла нет, ресурсы встроены в dll), но для конкретного ресурса (строка, растровое изображение, значок и т.д., как указано в файле ресурса src).

«RESFILE» не является ни одним из разрешенных типов ресурсов, список см. ResourceTypes.

0

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

Похоже, ваш третий параметр неверен.

Из MSDN:

HRSRC WINAPI FindResource(
_In_opt_ HMODULE hModule,
_In_     LPCTSTR lpName,
_In_     LPCTSTR lpType
);

lpType [in]

Тип ресурса. Альтернативно, а не
указатель, этот параметр может быть MAKEINTRESOURCE (ID), где ID является
целочисленный идентификатор данного типа ресурса. Для стандартного ресурса
типы, см. Типы ресурсов. Для получения дополнительной информации см. Примечания
раздел ниже.

Используйте ссылку выше, чтобы найти тип вашего ресурса и использовать его вместо «RESFILE».

Например.

ResLocation = FindResource(hInstDLL, "RESFILE", MAKEINTRESOURCE(RT_VERSION));

0

Я нашел, в чем проблема.

Был еще один исполняемый файл, который записал другой ресурс на тот же DLL во время выполнения.
Это было сделано с помощью BeginUpdateResource ().

Проблема заключалась в том, что второй параметр BeginUpdateResource () был установлен в значение true: при добавлении нового ресурса он удалял старый, который я добавил во время разработки. Установка этого параметра в false, решила мою проблему.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector