编写MFC的扩展动态库导出类
时间:2010-06-29 来源:laiboy
编写MFC的扩展动态库导出类
忙碌命
http://laiboy.cublog.cn
概述
在很多少第三方界面库,如XTreme,BCG等,都会提供动态库链接选项,让界面库作为动态加载选择.这些库都比较大,但是我们只是想要一小部分功能,这就需要涉及我们只需将MFC一部分类作为基类,封装成动态库,而不需要封装所有的类。
例如,我实现一个布局元素可自动调整的对话框,为了重用,我将基封装成动态库,有可能我灵感一动,又增加一些新的功能,做成了一个通用的扩展库。
实现
我们可样这样导出一个类:
classs AFX_CLASS_EXPORT CDialogEx : public CDialog
{
......
}
编译没有问题,调用这个基类动态库的时候。
GetMessageMap这个类成员不能链接,很简单,因为在MFC的 afxv_dll.h中,AFX_CLASS_EXPORT被定义为 __declspec( export ),还有一个 AFX_CLASS_EXPORT,在引用这个自定义的扩展类的时候,认为GetMessageMap是不导出的,因此,需要重新声明 __declspec( .... ).
#ifdef MFC_SELF_CLASS_LIB
#define MFC_CLASS_EX_API __declspec( dllexport )
#else
#define MFC_CLASS_EX_API __declspec( dllimport )
#endif // MFC_SELF_CLASS_LIB
上述的基类声明可以改成如下
classs AFX_CLASS_EX_API CDialogEx : public CDialog
{
......
}
重新编译即可通过.动态库的工程需要定MFC_SELF_CLASS_LIB
这样使用库的程序不需要定义任何宏.
我在CDialogEx这个库中增加布局控制,任何派生这个CDialogEx的对话框类,就可以实现控件的自动排布,不再像原来的的对话框类那样需要自已调整对话框的控件.使用类的方法和原来的MFC的工程一样,将演示Demo工程中的CDialog都改成CDialogEx的派生,并链接LIB库,代码很少改动,就实现了一个自动调整控件布局的对话框.
当然,有源码演示.代码可能随意修改!但是请保留原作者信息.
总结
这个看来不是什么难事,但是,越是简单的东西越是重要,将MFC的类作为基类,也是实现MFC封装应用的类似插件应用的程序和扩展MFC库的重要手段之一.以前我写的插件框架,也是这样的封装模块技术.希望这篇拙作高手们不要拍砖!!!
|