Самое первое, что вы должны сделать, это объявить тип указателя функции, который совместим с экспортируемой функцией. Правильное понимание этого является критически важным фактором, который может привести к неприятностям. Посмотрите внимательно на объявление функции, чтобы получить это:
typedef DWORD (WINAPI * GetTickCount_t)(void);
Затем используйте LoadLibrary и GetProcessAddress, чтобы получить значение указателя на функцию. Вы всегда должны приводить возвращаемое значение GPA к типу указателя на функцию. Как это:
HMODULE hKernel = LoadLibrary(L"kernel32.dll");
assert(hKernel);
GetTickCount_t pfnGetTickCount = (GetTickCount_t)GetProcAddress(hKernel, "GetTickCount");
assert(pfnGetTickCount);
Режимы сбоя здесь - это путь к DLL. Мне не нужно было указывать один, потому что kernel32.dll хранится в c: \ windows \ system32, каталоге, который всегда находится в пути поиска. Как правило, это не относится к вашей собственной DLL. Только сохраняя его в том же каталоге, что и ваш основной EXE-файл, вы можете указать только имя DLL-файла, а не полный путь. Просмотрите документы для SetDllDirectory () для получения дополнительной информации.
И имя экспортируемой функции. Опять же, здесь было легко, функции Windows API экспортируются с недекорированными именами. Обычно это не относится к вашей собственной DLL, экспорт может быть экспортирован с начальным подчеркиванием, постфиксом "@nn" или искаженным именем, если вы не объявили функцию с extern "C" и использовали компилятор C ++. Чтобы увидеть настоящее имя, используйте Dumpbin.exe / exports в вашей DLL. Также обратите внимание, что GetProcAddress использует const char *, в отличие от остальной части Windows API, которая использует строки Unicode. Нет префикса L в строковом литерале.
Тогда вы называете это, это просто:
DWORD tick = pfnGetTickCount();
Если вы неправильно определили объявление типа указателя на функцию, вы можете потерпеть крах вашей программы с помощью AV, получить странные результаты функции или несбалансированный стек.