Загрузка DLL из ресурса
HM: Cardinal;
DLLFunc: TDLLGetClassObject = nil;
Resource: TResourceStream;
...
Resource := TResourceStream.Create(Hinstance, 'Lib', Pchar('DLLFILE'));
...
затем получаю хендл модуля:
{эту функцию импортирую из kernel32}
Потом самое интересное. Хочу получить функцию 'DllGetClassObject' с помощю которой можно получить ClassFactory:
Но ничего не получаю. Причем, если вместо GetModuleHandleExA, грузить из файла HM := LoadLibrary('SimpleDLL.dll'), то все работает.
это наверно потому что, когда ты грузишь через TResourceStream DLL размещается в памяти как файл, а не как PE образ, т.е. без учета выранивания секций, таблиц импорта, экспорта и релоков. А когда ты грузишь через LoadLibrary, то DLL грузится как PE образ.
Непонял вопроса.
HM - Cardinal, и я так понимаю оно получает хендл модуля ДЛЛки
это наверно потому что, когда ты грузишь через TResourceStream DLL размещается в памяти как файл, а не как PE образ, т.е. без учета выранивания секций, таблиц импорта, экспорта и релоков. А когда ты грузишь через LoadLibrary, то DLL грузится как PE образ.
Оно точно размещается, как файл. Потому что если сделать SaveToFile, то получим нормальную ДДЛку. И я посмотрел исходники, оно пишет в файл бат в байт с того же участка памяти, на который указывает Resource.Memory.
P.S. Есть идеи как это реализовать?
Ну-ну... Если учесть вот это:
__in DWORD dwFlags,
__in LPCTSTR lpModuleName,
__out HMODULE* phModule );
Причем здесь вообще указатель на кусок памяти с загруженным в него ресурсом, когда ясно указано, что вторым параметром идет имя модуля, т.е. имя и путь к файлу?
Описание и решение твоей задачи вроде видел на rsdn.ru в виде статьи. Причем, там использовался Delphi. Вот только сейчас найти не могу :(
HM - Cardinal, и я так понимаю оно получает хендл модуля ДЛЛки
я хотел спросить какое фактическое значение у тебя сохранилось в переменной HM? но если суть проблемы понятна, то это уже не имеет значения.
Оно точно размещается, как файл. Потому что если сделать SaveToFile, то получим нормальную ДДЛку. И я посмотрел исходники, оно пишет в файл бат в байт с того же участка памяти, на который указывает Resource.Memory.
P.S. Есть идеи как это реализовать?
ну тогда всё просто
SaveToFile(куда-нибудь во временный файл)
потом LoadLibrary и всё.
__in DWORD dwFlags,
__in LPCTSTR lpModuleName,
__out HMODULE* phModule );
Причем здесь вообще указатель на кусок памяти с загруженным в него ресурсом, когда ясно указано, что вторым параметром идет имя модуля, т.е. имя и путь к файлу?
Неужели ты думаешь, что я вот так взял и решил вместо имени загнадь адресс в памяти, авось получится?
Почитай в MSDN про GetModuleHandleEx, тогда наверное обратиш внимание и на первый параметр.
SaveToFile(куда-нибудь во временный файл)
потом LoadLibrary и всё.
Идея именно в том, чтоб ничего никуда не сохранять.
Тем более, что GetModuleHandleEx возвращает true (проверял при неверном указателе - возращает false).
А в HM возарвщаются циферки :) этоже хендл, как его с чем-то сравнить? Или я все еще не понял в чем вопрос?
Почитай в MSDN про GetModuleHandleEx, тогда наверное обратиш внимание и на первый параметр.
Ну дык читаем MSDN чуть выше:
т.е. DLL-ка должна быть загружена в адресное пространство процесса. И тогда логично получается, что флаг GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS позволяет по любому адресу из адресного пространства текущего процесса получить модуль, который замапен в этот адрес.
Так что, подозреваю, что у тебя функция возвращает хэндл экзешника программы. ;)
Сравни ради интереса вызовы функции с передачей адреса ресурса и просто nil.
Мда, я это проигнорировал :)
На счет nil - ничего не возвращает, результат false, ErrorCode-87 (The parameter is incorrect. );
Спасибо за ссылку, но судя по функциональным ограничениям данного метода ("Не работают также некоторые функции, работающие с HInstance DLL (например, GetProcAddress)."), он мне не подходит, так-как именно GetProcAddress мне и нужен. Но это так, при беглом просмотре. Потом внимательно разберусь, может чего придумаю
в статьях Ms-Rem'a про перехват API функций (во второй статье) есть код который грузит DLL настраивает релоки, экспорты и импорты. (DLL у тебя уже в памяти осталось только всё настроить)