Я пытаюсь создать библиотеку Lib.dll
для динамического вызова из консольного приложения, но не могу найти функцию funci()
Я хочу вызвать.
Lib.dll
является результатом проект (консольное приложение, но с заданным типом конфигурации: .dll), созданный в Visual Studio 2019.
Lib.cpp
- единственный файл в этом проекте, содержащий только код:
__declspec(dllexport) int funci()
{
return 50;
}
Я думаю, что экспортирую функцию правильно, так как я нашел ее с помощью DLL Export Viewer v1.66 .
Однако я пытаюсь найти функцию через мое консольное приложение (.exe):
#include <windows.h>
#include <iostream>
typedef int(__cdecl* o_funci)(void);
o_funci funci;
int main()
{
HINSTANCE hGetProcIDDLL = LoadLibraryA("C:\\Lib.dll");
if (!hGetProcIDDLL) {
std::cout << "could not load the dynamic library" << std::endl;
return EXIT_FAILURE;
}
// resolve function address here
funci = (o_funci) GetProcAddress(hGetProcIDDLL, "funci");
if (!funci) {
std::cout << "could not locate the function" << std::endl;
return EXIT_FAILURE;
}
std::cout << "funci() returned " << funci() << std::endl;
FreeLibrary(hGetProcIDDLL);
}
Что-то происходит неправильно в GetProcAddress
, но не знаю почему. Может кто-нибудь помочь объяснить, где я go не прав?
Вывод:
Я просматривал этот старый пост: Динамически загружать функцию из DLL
РЕДАКТИРОВАТЬ: РЕШЕНО СПАСИБО tenfour
Я использовал DependencyWalker.
Без extern "C"
я мог видеть, что неокрашенный funci
имел имя ?funci@@YGHXZ
,
Итак funci = (o_funci)GetProcAddress(hGetProcIDDLL, "?funci@@YGHXZ");
работал.
С extern "C"
у неокрашенного funci
было название _funci@0
- немного чище.
Другое примечание; использование порядкового номера 0x0001
сработало в обоих случаях. Как это: funci = (o_funci)GetProcAddress(hGetProcIDDLL, (PCSTR)0x0001);