如何动态装载DLL的导出类?
我的DLL包括一个对话框,我想在MDI框架中动态地装入这个DLL,然后显示出来。
在DLL的h 中我已经定义:class AFX_EXT_CLASS CDlg : public CDialog 导出CDlg这个类
如果是静态调用只要装入 lib 和 h 文件就可以直接使用这个类了,如果采用动态装入的方法该怎么做呢?
问题点数:100、回复次数:11Top
1 楼newzk(zk)回复于 2005-05-18 15:56:24 得分 0
导出类好像只能静态调用吧,帮你顶Top
2 楼color99(木头人)回复于 2005-05-18 15:59:23 得分 0
我是这样计划的:
框架使用MDI,然后每个子模块打包成一个DLL,在框架中只需load这个DLL就可以使用这个模块,如果不发布这个DLL的话可以限制客户使用这项功能,当然也要以发布DLL来Updata软件的功能。Top
3 楼krh2001(边城浪子)回复于 2005-05-18 16:13:17 得分 20
可以动态加载,不过实现起来会很麻烦的. 你需要从DLL 中取每一个成员函数的地址, 通常这些函数的名字会是乱的.你可能要在DLL里给函数重新命名.
Top
4 楼color99(木头人)回复于 2005-05-18 16:28:02 得分 0
To krh2001(边城浪子)
那我这种开发思路是否真正的可行?COM我是不想使用的了,因为我对它的了解太少。Top
5 楼younggle(洋溢)回复于 2005-05-18 16:33:59 得分 55
可以的啊。动态加载也不难的啊。
可以使用LoadLibrary和GetProcAddress进行实现。
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0,250,2);
FreeLibrary(hInst);
}
Top
6 楼color99(木头人)回复于 2005-05-18 17:19:43 得分 0
TO younggle(洋溢)
SetLayeredWindowAttributes这个函数该怎么写呢?
它应该是DLL里面定义的一个函数吧?它应该返回一个窗口的句柄吧。你能写得具体些吗?Top
7 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-05-18 21:35:38 得分 5
记得codeguru那有个动态加载类的例子Top
8 楼san_huo(煽风点火)回复于 2005-05-18 22:56:36 得分 10
你可以将所有接口做成类导出 然后不同的版本有不同的实现,但接口没变就可以了。
com看起来难,实际使用也就那样,不是很复杂,建议使用。Top
9 楼etre(林荃)回复于 2005-05-19 09:41:16 得分 0
extern "C" AFX_EXT_API UINT CreateDockBar(ObtGuiGcomDockingControlBar** toolBar,CCreateContext* pContext)
{
*toolBar = new ObtGcomChatOpiBar(pContext);
return(0);
}
我是这样的.Top
10 楼final()回复于 2005-05-19 10:13:02 得分 10
可以实现的, 使用一个抽象类, 所有dialog都从该抽象类派生,然后写一个api接口去取 CDialog的实例指针.
Top
11 楼ys0102(晨晓)回复于 2005-07-14 11:43:41 得分 0
动态导出类的函数好像不是什么时候都能搞定的,如果类有用户自己的构造函数,并且其他函数需要用到这个类的私有成员变量的时候,导出的问题就来了!类的成员函数通常只有类的对象(除了静态的成员函数)才能调用,这时的动态调用就没法进行了!!!Top




