Есть такая проблема. В моей dll находится рисунок в ресурсах. Подключать dll будет стороннее приложение. После подгрузки моей dll и вызова экспортной функции, в этой функции нужно подгрузить ресурс. Делаю так
но hBitmap получается 0 с ошибкой 1813 — The specified resource type cannot be found in the image file.
но ресурс такой и тип в dll точно есть. я думаю что LoadBitmap пытается найти этот ресурс не в dll а в приложении, которое его вызывало, а там естественно другие ресурсы и типы. вообще можно ли как-то загрузить именно из dll? Конечно можно сначала вызвать LoadLibrary для этой же dll, но это будут уже лишние движения, зачем повторно загружать библиотеку, она уже загружена.
Здравствуйте, loggik, Вы писали:
L>Добрый день всем.
L>Есть такая проблема. В моей dll находится рисунок в ресурсах. Подключать dll будет стороннее приложение. После подгрузки моей dll и вызова экспортной функции, в этой функции нужно подгрузить ресурс.
//Load the resource module:
HINSTANCE module = LoadLibrary(module_name);
// Find the resource using the resource ID from file "resource.rh"
HRSRC rsrc = FindResource(module, MAKEINTRESOURCE(resource_ID),RT_RCDATA);
...
R>//Load the resource module:
R> HINSTANCE module = LoadLibrary(module_name);
R>// Find the resource using the resource ID from file "resource.rh"
R> HRSRC rsrc = FindResource(module, MAKEINTRESOURCE(resource_ID),RT_RCDATA);
R>...
R>
Тоже не получилось, функция явно ищет ресурсы не в dll, а в вызвавшем ее exe. т.е. по сути задача сводится как определить hmodule для dll а не для exe, и без LoadLibrary
Это делается проще. Когда грузится dll, в ее точку входа (DllMain) приходит хэндл модуля.
Вот его и надо запомнить, а потом использовать для загрузки ресурсов, находящися в ней.
Да и для и других функций тоже.
А находить и загружать ресурсы надежнее всего с помощью трио EnumResourceTypes,
EnumResourceNames и EnumResourceLanguages. Дело в том, что в зависимости от того, каким
способом ресурсы добавляются в проект, они могут получать разные языковые идентификаторы, и
в определенных ситуациях стандартными FindResource(Ex) эти ресурсы перестают находиться.
Здравствуйте, okman, Вы писали:
O>Это делается проще. Когда грузится dll, в ее точку входа (DllMain) приходит хэндл модуля. O>Вот его и надо запомнить, а потом использовать для загрузки ресурсов, находящися в ней.
база модуля известна статически, на этапе линковки, ее не надо ниоткуда получать.
Здравствуйте, Abyx, Вы писали:
A>база модуля известна статически, на этапе линковки, ее не надо ниоткуда получать. A>
A>extern"C" IMAGE_DOS_HEADER __ImageBase;
A>
Топикстартеру не нужна база модуля, ему нужен HINSTANCE dll-ки для передачи в функцию.
То, что они совпадают — еще не повод использовать недокументированный символ компоновщика.
А в DllMain приходит opaque handle и по-хорошему должно быть безразлично, равен ли он
базе модуля или там какое-то другое, произвольно взятое значение.
Здравствуйте, okman, Вы писали:
O>Топикстартеру не нужна база модуля, ему нужен HINSTANCE dll-ки для передачи в функцию. O>То, что они совпадают — еще не повод использовать недокументированный символ компоновщика.
если Вы не знаете что такое "HINSTANCE" и "база модуля", это не повод советовать не использовать `__ImageBase`.
Здравствуйте, Abyx, Вы писали:
A>если Вы не знаете что такое "HINSTANCE" и "база модуля", это не повод советовать не использовать `__ImageBase`.
Ну я так и думал. По существу вопроса есть что возразить ?
__ImageBase не документирован, к этому мне нечего добавить. Перед тем, как советовать всякую
недокументированную фигню, следует как минимум привести список платформ и компиляторов, на
которых она работает. Чтобы люди три раза подумали, стоит с этим связываться или нет.