好吧,所以我开始意识到 dll 并不是最容易理解的东西,我正在尝试制作一个与 VC6 兼容的 dll,我得到了一些在 VS2010 中工作的代码,但在尝试弄清楚如何为了使该代码适用于 VC6 项目,我发现了以下问题:
我对dll的调用是这样的
MyDll::connect();
当我尝试运行一个使用这个函数的程序时,它开始时很好,但是一旦它进入一个函数调用,即
VOID connect()
{
hello(); //0xC0000005: access violation
}
VOID hello()
{
int i = 1;
}
反汇编看起来像这样:
-> 00000000 ???
00000001 ???
00000002 ???
00000003 ???
00000004 ???
00000005 ???
00000006 ???
00000007 ???
00000008 ???
00000009 ???
etc...
最佳答案
您没有导出函数 .....不允许程序访问 dll 中的函数,除非该函数已注册为导出函数。 为此,您应该像这样制作原型(prototype)
要在类中导出一个函数,这个函数应该 1- 成为公众成员。 2- 成为静态成员
class MyDll{
public:
static void connect();
}
//then redeclare it like this
#ifdef _cplusplus
extern "C"{
#endif
__declspec(dllexport) void MyDll::connect(){
//TODO
}
#ifdef _cplusplus
}
#endif
对你想要导出的任何类成员函数执行此操作
这是一个例子
关于c++ - 调用 dll 中的另一个函数会导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25360354/