//1.dll文件
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
return TRUE;
}
class cla
{
public:
virtual void a();
virtual void b();
};
extern "C"
{
void __declspec(dllexport) Show(cla* AStruct)
{
AStruct->a();
AStruct->b();
};
}
////////////////1.exe文件
class cla
{
public:
virtual void a();
virtual void b();
};
void cla::a(){cout<<"本机cla::a"<<endl;}
void cla::b(){cout<<"本机cla::b"<<endl;}
void main()
{
HMODULE hmod=LoadLibrary("1.dll");
typedef void (*dll) (cla* AStruct);
dll fun=(dll)GetProcAddress(GetModuleHandle(NULL),"Show");
cla a;
fun(&a);
system("pause");
}
结果运行就出现错误——1.exe 中的 0x00000000 处有未经处理的异常: 0xC0000005: Access violation
代码中,我要说明下,我是vs2010+win8.1测试的,之所以dll的类中的函数要写成虚函数是因为如果我不加,程序就会报错——
(1.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall cla::b(void)" (?b@cla@@QAEXXZ),该符号在函数 _Show 中被引用
1>1.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall cla::a(void)" (?a@cla@@QAEXXZ),该符号在函数 _Show 中被引用)
,根本不能生成dll。只有加上virtual才顺利通过。
而错误Access violation,我的理解是程序可能是触发了window的内存保护机制,但是我查了资料,网上的让你就评论说这是空指针的原因,我就不懂了。。。究竟应该怎么修改才能让程序运行额?难道真的不能这样做吗????