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