调用dll中的另一个函数会导致访问冲突

时间:2014-08-18 09:42:35

标签: c++ dll access-violation disassembly

好的,所以我开始意识到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...

1 个答案:

答案 0 :(得分:1)

您没有导出该函数.....除非该函数被注册为导出函数,否则不允许程序访问dll中的函数。 要做到这一点你应该像这样原型

在类中导出一个函数应该这个函数 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

对要导出的任何类成员函数执行此操作

这是一个例子

Creating a simple Dynamic Link Library example