我在论坛中看到只要在dll的类前加入_declapec( dllexport)然后在引用的地方加入dll、lib、.h文件就可以了。我试了之后不行,编译时提示error LNK2001: unresolved external symbol "public: void __thiscall CModem::InitModem(struct HWND__ *)" (?InitModem@CModem@@QAEXPAUHWND__@@@Z)请问个为这到底是什么原因,谁有列子,可供参考,我用的是普通dll。
如果我要动态加载应该如何解决?
谢谢!谢谢!
如果我要动态加载应该如何解决?
谢谢!谢谢!
如
class AFX_EXT_CLASS aClass : public Parent
只是手法要变通一些。假设你要导的类叫CMyClass
写个虚函数表:
class IMyClass{
virtual HRESULT __stdcall myFun() = 0;
//其它虚函数
}
//实现类:
class CMyClass : public ICyClass{
HRESULT __stdcall myFun();
//其它实现
}
导出函数
HRESULT __stdcall getObject(void **p)
{
*p = (void *)new CMyClass;
return S_OK;
}在调用DLL的程序里,include那个虚函数表,再调用getObject得CMyClass实例指针,将其转换为(IMyClass *)p即可使用。
//#include "COM.h" 它里面有关于IMyClass的定义(虚函数表)。不要出现CMyClass的定义。IMyClass *pObject; //不要写成CMyClass *pObjcet
//loadlibrary
//用函数指针调*pFun(&pObject);
if(pObject!=NULL)
pObjcet->WriteCom();//即可通过编译最最最关键的地方是你虚函数表有没有写对。否则LINK出错。
在你想要导出的类定义前加 AFX_EXT_CLASS 宏
例:
class AFX_EXT_CLASS myclass
{
....
....
};
在引用工程中包含导出头文件,工程设置 .lib
就可了。
#ifdef MY_DLL
#define DLL_CLASS _declapec( dllexport)
#else
#define DLL_CLASS _declapec( dllimport)
#endclass DLL_CLASS MyClass
{
...
}2.在DLL工程中定义MY_DLL宏
不要.DEF文件
设置要输出.lib3.在EXE工程中 不 定义MY_DLL宏
LinkDLL工程中生成的.lib文件