Вам действительно нужно делать все, что вы написали? Получение списка экспортируемых функций с помощью dll не является тривиальным, после получения адреса модуля в памяти вам нужно пройти несколько структур данных в формате PE, что не так просто сделать вручную (хотя DbgHelp functions автоматизирует большую часть процесса) ,
С другой стороны, если вы просто хотите проверить, загружена ли dll и вызвать одну из ее функций, работа становится легкой.
Если вам все равно, нужно ли загружать dll, просто позвоните LoadLibrary
и получите ручку модуля; в противном случае вызовите сначала GetModuleHandle
, который предоставит вам дескриптор модуля, если он загружен, NULL
, если это не так, и, если вы хотите продолжить, после этого вызова LoadLibrary
(LoadLibrary
) увеличивает количество ссылок на DLL, так что вы конечно, dll не будет разгружаться тем временем).
Затем, чтобы проверить, присутствует ли процедура и получить ее адрес, используйте GetProcAddress
; обратите внимание, что обычно C-функции, подобные тем, которые экспортируются в DLL-файлы Windows, экспортируются только по их имени, а не по их подписи (в C-перегрузке не существует); если вы хотите вызывать процедуры C++, экспортированные с украшенными именами, вы должны указать искомое имя.
GetProcAddress
вернет вам указатель, который вам нужно будет отнести к указателю функции с правильной подписью вашей функции; теперь вы закончили, просто используйте его для вызова функции и не забудьте позвонить FreeLibrary
, чтобы уменьшить ссылочный счетчик в dll.
Обратите внимание, что все эти вещи не могут быть сделаны безопасно изнутри DllMain
вашей введенной функции; см. here.
Чтобы ответить на ваши вопросы, да. Я ухожу, и я расскажу вам, как далеко я нахожу :) – flavour404
@ flavour404: ну, тогда вы должны действительно изучить функции DbgHelp; делать эту работу вручную не невозможно, но она довольно подвержена ошибкам. –