загрузка рисунка из ресурса dll
От: loggik  
Дата: 01.02.13 18:03
Оценка: -1
Добрый день всем.

Есть такая проблема. В моей dll находится рисунок в ресурсах. Подключать dll будет стороннее приложение. После подгрузки моей dll и вызова экспортной функции, в этой функции нужно подгрузить ресурс. Делаю так

HBITMAP hBitmap = LoadBitmapA((HINSTANCE)GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BMP1));


но hBitmap получается 0 с ошибкой 1813 — The specified resource type cannot be found in the image file.
но ресурс такой и тип в dll точно есть. я думаю что LoadBitmap пытается найти этот ресурс не в dll а в приложении, которое его вызывало, а там естественно другие ресурсы и типы. вообще можно ли как-то загрузить именно из dll? Конечно можно сначала вызвать LoadLibrary для этой же dll, но это будут уже лишние движения, зачем повторно загружать библиотеку, она уже загружена.

Заранее благодарю за помощь в проблеме.
Re: загрузка рисунка из ресурса dll
От: rumit7  
Дата: 01.02.13 18:11
Оценка: -1
Здравствуйте, loggik, Вы писали:

L>Добрый день всем.


L>Есть такая проблема. В моей dll находится рисунок в ресурсах. Подключать dll будет стороннее приложение. После подгрузки моей dll и вызова экспортной функции, в этой функции нужно подгрузить ресурс.


http://www.codeproject.com/Articles/17996/Load-JPEG-images-from-DLL-with-LoadResource-in-Man


//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);

...
Re[2]: загрузка рисунка из ресурса dll
От: loggik  
Дата: 01.02.13 18:32
Оценка: -1
Здравствуйте, rumit7, Вы писали:

R>
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
Re[3]: загрузка рисунка из ресурса dll
От: loggik  
Дата: 01.02.13 18:42
Оценка: :)
Вопрос решен, вот с таким дескриптором ресурс находится.
HANDLE GetCurrModuleHandle()
{
    char path[MAX_PATH] = {0};

    MEMORY_BASIC_INFORMATION minfo;
    ZeroMemory(&minfo, sizeof(MEMORY_BASIC_INFORMATION));
    if(VirtualQuery((void *)GetCurrModuleHandle, &minfo, sizeof(MEMORY_BASIC_INFORMATION)))
    {
        GetModuleFileName((HMODULE)minfo.AllocationBase, path, MAX_PATH);
        return GetModuleHandle(path);
    }

    return 0;
}
Re[4]: загрузка рисунка из ресурса dll
От: okman Беларусь https://searchinform.ru/
Дата: 01.02.13 19:19
Оценка:
Здравствуйте, loggik, Вы писали:

L>Вопрос решен, вот с таким дескриптором ресурс находится.


L>
L>HANDLE GetCurrModuleHandle()
L>{
L>    char path[MAX_PATH] = {0};

L>    MEMORY_BASIC_INFORMATION minfo;
L>    ZeroMemory(&minfo, sizeof(MEMORY_BASIC_INFORMATION));
L>    if(VirtualQuery((void *)GetCurrModuleHandle, &minfo, sizeof(MEMORY_BASIC_INFORMATION)))
L>    {
L>        GetModuleFileName((HMODULE)minfo.AllocationBase, path, MAX_PATH);
L>        return GetModuleHandle(path);
L>    }

L>    return 0;
L>}
L>


Это делается проще. Когда грузится dll, в ее точку входа (DllMain) приходит хэндл модуля.
Вот его и надо запомнить, а потом использовать для загрузки ресурсов, находящися в ней.
Да и для и других функций тоже.

А находить и загружать ресурсы надежнее всего с помощью трио EnumResourceTypes,
EnumResourceNames и EnumResourceLanguages. Дело в том, что в зависимости от того, каким
способом ресурсы добавляются в проект, они могут получать разные языковые идентификаторы, и
в определенных ситуациях стандартными FindResource(Ex) эти ресурсы перестают находиться.
Re[5]: загрузка рисунка из ресурса dll
От: Abyx Россия  
Дата: 01.02.13 22:12
Оценка:
Здравствуйте, okman, Вы писали:

O>Это делается проще. Когда грузится dll, в ее точку входа (DllMain) приходит хэндл модуля.

O>Вот его и надо запомнить, а потом использовать для загрузки ресурсов, находящися в ней.

база модуля известна статически, на этапе линковки, ее не надо ниоткуда получать.
extern "C" IMAGE_DOS_HEADER __ImageBase;
In Zen We Trust
Re[6]: загрузка рисунка из ресурса dll
От: nen777w  
Дата: 01.02.13 23:35
Оценка:
A>база модуля известна статически, на этапе линковки, ее не надо ниоткуда получать.
A>
A>extern "C" IMAGE_DOS_HEADER __ImageBase;
A>


А разве не может случиться релокейшен если базы у нескольких dll или dll и exe будут совпадать?
Re[7]: загрузка рисунка из ресурса dll
От: Abyx Россия  
Дата: 02.02.13 10:00
Оценка:
Здравствуйте, nen777w, Вы писали:

A>>база модуля известна статически, на этапе линковки, ее не надо ниоткуда получать.

A>>
A>>extern "C" IMAGE_DOS_HEADER __ImageBase;
A>>


N>А разве не может случиться релокейшен если базы у нескольких dll или dll и exe будут совпадать?


случится, и что? ссылки на базу тоже поправятся
In Zen We Trust
Re[6]: загрузка рисунка из ресурса dll
От: okman Беларусь https://searchinform.ru/
Дата: 02.02.13 15:39
Оценка: -1
Здравствуйте, Abyx, Вы писали:

A>база модуля известна статически, на этапе линковки, ее не надо ниоткуда получать.

A>
A>extern "C" IMAGE_DOS_HEADER __ImageBase;
A>


Топикстартеру не нужна база модуля, ему нужен HINSTANCE dll-ки для передачи в функцию.
То, что они совпадают — еще не повод использовать недокументированный символ компоновщика.
А в DllMain приходит opaque handle и по-хорошему должно быть безразлично, равен ли он
базе модуля или там какое-то другое, произвольно взятое значение.
Re[7]: загрузка рисунка из ресурса dll
От: Abyx Россия  
Дата: 02.02.13 22:00
Оценка:
Здравствуйте, okman, Вы писали:

O>Топикстартеру не нужна база модуля, ему нужен HINSTANCE dll-ки для передачи в функцию.

O>То, что они совпадают — еще не повод использовать недокументированный символ компоновщика.

если Вы не знаете что такое "HINSTANCE" и "база модуля", это не повод советовать не использовать `__ImageBase`.
In Zen We Trust
Re[8]: загрузка рисунка из ресурса dll
От: okman Беларусь https://searchinform.ru/
Дата: 02.02.13 22:50
Оценка: +2
Здравствуйте, Abyx, Вы писали:

A>если Вы не знаете что такое "HINSTANCE" и "база модуля", это не повод советовать не использовать `__ImageBase`.


Ну я так и думал. По существу вопроса есть что возразить ?

__ImageBase не документирован, к этому мне нечего добавить. Перед тем, как советовать всякую
недокументированную фигню, следует как минимум привести список платформ и компиляторов, на
которых она работает. Чтобы люди три раза подумали, стоит с этим связываться или нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.