Соглашение о вызовах изменяет название искажения.* * * * * Функции __stdcall
всегда имеют свои имена с добавлением _
и искажены и другими способами, так что ссылка завершается ошибкой, но функция __cdecl
не искажается, и поэтому она найдена.
Чтобы импортировать из библиотеки DLL, созданной с помощью __declspec(dllexport)
, необходимо всегда включать заголовок со __declspec(dllimport)
для всего, что вы хотите импортировать, и связывать библиотеку, полученную при сборкеDLL.Это гарантирует, что все ваши функции связываются правильно, и вам не нужно переходить к C-совместимым ссылкам.
Не следует использовать GetProcAddress
и extern "C"
в сочетании с __declspec(dllexport)
.
Заголовок:
#include <windows.h>
#ifndef MAIN
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API LRESULT CALLBACK hookProc(int code, WPARAM wParam, LPARAM lParam);
DLL_API int add(int a, int b);
DLL .cpp файл:
#include "SimpleHook.h"
DLL_API LRESULT CALLBACK hookProc(int code, WPARAM wParam, LPARAM lParam) {
return CallNextHookEx(0, code, wParam, lParam);
}
DLL_API int add(int a, int b) {
return a + b;
}
Основной файл .cpp:
#define MAIN
#include "SimpleHook.h"
int main(int argc, char* argv[]) {
if (dllHandle) {
// returns the correct address
cout << "add address: " << add << endl;
// returns NULL
cout << "hookProc address: " << hookProc << endl;
}
}
Не забудьте добавить библиотеку в компоновщик.