我正在尝试动态加载dll
并在运行时从中调用函数。我已经成功获得了GetProcAddress
的工作指针,但如果dll
中的函数使用stdlib
,程序会崩溃。这是加载dll
的可执行文件的代码:
#include <iostream>
#include <windows.h>
typedef int (*myFunc_t)(int);
int main(void) {
using namespace std;
HINSTANCE dll = LoadLibrary("demo.dll");
if (!dll) {
cerr << "Could not load dll 'demo.dll'" << endl;
return 1;
}
myFunc_t myFunc = (myFunc_t) GetProcAddress(dll, "myFunc");
if (!myFunc) {
FreeLibrary(dll);
cerr << "Could not find function 'myFunc'" << endl;
return 1;
}
cout << "Successfully loaded myFunc!" << endl;
cout << myFunc(3) << endl;
cout << myFunc(7) << endl;
cout << myFunc(42) << endl;
cout << "Successfully called myFunc!" << endl;
FreeLibrary(dll);
return 0;
}
以下是实际有效的dll
代码:
#include <iostream>
extern "C" {
__declspec(dllexport) int myFunc(int demo) {
//std::cout << "myFunc(" << demo << ")" << std::endl;
return demo * demo;
}
}
int main(void) {
return 0;
}
(注意main
代码中的dll
方法只是为了安抚编译器)
如果我取消注释std::cout
行,那么程序会在cout << "Sucessfully loaded myFunc!" << endl;
行之后崩溃,但在打印之前会崩溃。我知道必须有办法做我想做的事情;我需要改变它才能发挥作用?
答案 0 :(得分:1)
正如评论中所讨论的那样,结果是编译器对main
函数的要求暗示我无意中创建了一个exe
,它明确地使用了文件扩展名dll
,不是实际的dll
(因为我不太了解我正在使用的编译器选项),这在某种程度上搞砸了该程序集的动态加载。