У меня есть dll с некоторыми функциями. Заголовок примера:
__declspec(dllexport) bool Test()
; И у меня есть еще одно простое приложение для использования этой функции:
typedef bool(CALLBACK* LPFNDLLFUNC1)();
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
bool uReturnVal;
hDLL = LoadLibrary(L"NAME.dll");
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"Test");
if (!lpfnDllFunc1)
{
// handle the error
FreeLibrary(hDLL);
cout << "error";
}
else
{
// call the function
uReturnVal = lpfnDllFunc1();
}
}
Но не работайте. Функция не найдена.
Мои психические чувства говорят мне, что функция не была найдена, потому что вы забыли объявить ее как extern "C"
.
Из-за изменения имени в C++ фактическое имя функции, которое попадает в таблицу экспорта DLL, является более длинной и более строгой строкой, чем просто Test
если функция имеет связь C++. Если вы объявите его с помощью C-ссылки, он будет экспортироваться с ожидаемым именем и, следовательно, может быть импортирован более легко.
Например:
// Header file
#ifdef __cplusplus
// Declare all following functions with C linkage
extern "C"
{
#endif
__declspec(dllexport) bool Test();
#ifdef __cplusplus
}
// End C linkage
#endif
// DLL source file
extern "C"
{
__declspec(dllexport) bool Test()
{
// Function body
...
}
} // End C linkage