Chinaunix首页 | 论坛 | 博客
  • 博客访问: 212763
  • 博文数量: 67
  • 博客积分: 3156
  • 博客等级: 中校
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-18 17:41
个人简介

软件工程师!

文章分类

全部博文(67)

文章存档

2015年(1)

2014年(1)

2012年(6)

2011年(16)

2010年(31)

2009年(12)

分类: C/C++

2010-06-29 17:25:35

编写MFC的扩展动态库导出类

忙碌命

http://blog.csdn.net/laiboy

http://laiboy.cublog.cn

 

概述

在很多少第三方界面库,如XTremeBCG等,都会提供动态库链接选项,让界面库作为动态加载选择.这些库都比较大,但是我们只是想要一小部分功能,这就需要涉及我们只需将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库的重要手段之一.以前我写的插件框架,也是这样的封装模块技术.希望这篇拙作高手们不要拍砖!!!

 

文件: MFC Extention Dll.rar
大小: 173KB
下载: 下载

 
阅读(3249) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~