本文原创版权归 网易博客 平淡生活 所有,如有转载,请以如下方式标明原创作者及出处,以示尊重!

作者:平淡生活

出处:http://xinbaojiang.blog.163.com/blog/static/119970729200952411266197/

使用 AFX_EXT_CLASS 导出和导入

扩展DELL使用 AFX_EXT_CLASS 宏导出类;链接到扩展 DLL 的可执行文件使用该宏导入类。使用 AFX_EXT_CLASS 宏,用于生成扩展 DLL 的相同头文件可以与链接到 DLL 的可执行文件一起使用。

在 DLL 的头文件中,将 AFX_EXT_CLASS 关键字添加到类的声明中,如下所示:

class AFX_EXT_CLASS CMyClass : public Cdocument                                  {// };

当定义了预处理 _AFXDLL 和 _AFXEXT 时,该宏被 MFC 定义为 __declsp(dllexport).但当定义了 _AFXDLL 而未定义 _AFXEXT 时,该宏被定义为 __declspec(dllimport)。定义后,预处理器符号 _AFXDLL 指示共享 MFC 版本正在由目标可执行文件(DLL 或应用程序)使用。当 _AFXDLL 和 _AFXEXT 都定义了时,这指示目标可执行文件是扩展 DLL。

由于从扩展 DLL 导出时,AFX_EXT_CLASS 被定义为 __declspec(dllexport),因此可以导出整个类,而不必将该类的所有符号的修饰名放到 .DEF 文件中。此方法由 MFC 示例 DLLHUSK 使用。

虽然使用此方法可以避免创建 .DEF 文件和类的所有修饰名,但由于名称可以按序号导出,创建 .DEF 文件的效率更高。若要使用 .DEF 文件导出方法,请将下列代码放在头文件的开头和结尾处:

#undef AFX_DATA

#define AFX_DATA AFX_EXT_DATA

//

#undef AFX_DATA

#define AFX_DATA

警告   导出内联函数时要小心,因为它们有可能导致版本冲突。内联函数扩展到应用程序代码中;因此,如果以后重写内联函数,除非重新编译应用程序本身,否则内联函数不会被更新。(通常,不用重新生成使用 DLL 函数的应用程序就可以更新 DLL 函数。)

导出类中的个别成员

有时,您可能希望导出类中的个别成员。例如,如果导出 CDialog 派生类,可能只需要导出构造函数和 DoModal 调用。可以对需要导出的个别成员使用 AFX_EXT_CLASS。

例如:

class CExampleDialog : public CDialog

{

public:

AFX_EXT_CLASS CExampleDialog();

AFX_EXT_CLASS int DoModal();

...

// rest of class definition

...

};

您不再导出类的所有成员,但由于 MFC 宏的工作方式,您可能会遇到其他问题。几个 MFC 的 Helper 宏实际声明或定义数据成员。因此,还必须从 DLL 导出这些数据成员。

例如,当生成扩展 DLL 时,DECLARE_DYNAMIC 宏的定义如下:

#define DECLARE_DYNAMIC(class_name)

protected:

static CRuntimeClass* PASCAL _GetBaseClass();

public:

static AFX_DATA CRuntimeClass class##class_name;

virtual CRuntimeClass* GetRuntimeClass() const;

以 static AFX_DATA 打头的行声明类的内部静态对象。若要正确导出该类并从客户端可执行文件访问运行时信息,必须导出此静态对象。由于静态对象是用 AFX_DATA 修饰符声明的,因此只需在生成 DLL 时将 AFX_DATA 定义为 __declspec(dllexport),并在生成客户端可执行文件时将 AFX_DATA 定义为 __declspec(dllimport)。由于已经以此方式定义了 AFX_EXT_CLASS,因此只需参考类定义,将 AFX_DATA 重定义为与 AFX_EXT_CLASS 相同。

例如:

#undef AFX_DATA

#define AFX_DATA AFX_EXT_CLASS

class CExampleView : public CView

{

DECLARE_DYNAMIC()

// ... class definition ...

};

#undef AFX_DATA

#define AFX_DATA

MFC 总是在其宏的内部定义的数据项上使用 AFX_DATA 符号,因此该技术适用于所有这类情况。例如,它适用于 DECLARE_MESSAGE_MAP。

注意   如果导出整个类而非选定的类成员,静态数据成员将自动导出。

关于C++宏:AFX_EXT_CLASS相关推荐

  1. MFC下DLL编程(图解)

    DLL(Dynamic Link Library,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库.DLL是应用程序的一种扩展,也是软件共享和重用的传 ...

  2. VC++程序设计与应用--动态链接库

    目录 前言 一.动态链接库 1.1 概述 1.1.1 动态链接库的概念 1.1.2 动态链接库和静态链接库的区别 1.1.3 使用动态链接库的优点 1.1.4 DLL文件的存放位置 1.2 创建MFC ...

  3. MFC AFX_EXT_CLASS

    MFC扩展DLL是通常实现从现有Microsoft基础类库类派生的可重用类的DLL.       MFC扩展DLL具有下列功能和要求:           1.客户端可执行文件必须是用定义的_AFXD ...

  4. AFX_EXT_CLASS的使用

    如果要导出一个类(生成DLL提供给另外工程使用) 定义的时候加AFX_EXT_CLASS 并且在预定义配置项加上_AFXDLL 和 _AFXEXT 另个宏 参考:https://blog.csdn.n ...

  5. AFX_EXT_CLASS

    MFC扩展DLL是通常实现从现有Microsoft基础类库类派生的可重用类的DLL.       MFC扩展DLL具有下列功能和要求:           1.客户端可执行文件必须是用定义的_AFXD ...

  6. C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define

    C/C++预处理器在源代码编译之前对其进行一些文本性质的操作. 它的主要任务包括删除注释 . 插入 #include 指令包含的文件的内容 . 定义和替换由 #defme 指令定义的符号以及确定代码的 ...

  7. OpenCV 笔记(04)— OpenCV2 升级到 OpenCV3/CV4 的改动(去掉 CV_前缀、使用新的前缀替换、使用新的命名空间宏)

    1. 由于宏名称的变更照成的"未声明的标识符"系列问题 有时候,遇到此类问题加入一句 #include <cv.h> 便可以让 OpenCV3 或者 OpenCV4 也 ...

  8. TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成

    TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成 这个PR增加了对分区.编译和运行TensorRT BYOC目标的支持. Building 有两个新的cmake标志: ...

  9. 打开word出现“您正试图运行的函数包含有宏或需要宏语言支持的内容。”的解决方法

    1.Word选项→加载bai项→管理→转到--,转到→把勾勾都取消→确定即可. 2.工具→宏->安全性→可靠发行商,将下方的选择框中的钩清空,再将宏安全性改为最高. 3.可能是初次安装Offic ...

最新文章

  1. 好文推荐,15 分钟教你搞懂 Git!
  2. 架构模式_Index
  3. msflexgrid允许大选择_选择复式楼、跃层和别墅的装修业主如何做好家里的楼梯...
  4. Linux NULL定义
  5. 2014年自动化的个人感想
  6. 深度学习入门读书笔记:Day-14
  7. ASp.net常用服务
  8. 50套可视化报表模板直接用,做报告不用愁了!快收藏
  9. 这是一台家庭计算机重启无效,我买了一台二手计算机,配置还可以,但有时会自动重启机器,这是为什? 爱问知识人...
  10. poi实现Excel文件导出【SpringBoot篇】
  11. T410i升级i3 380M,上测试对比图,附拆机心得
  12. matlab入门基础函数
  13. MATLAB 批量下载网页中的数据
  14. pycharm如何正确打包ocr且让打包出来的exe尽量小
  15. 微信小程序,小游戏数据助手数据爬取!还敢随便授权小游戏吗?
  16. 自定义柱状图(水滴图)的填坑之路
  17. 服务停止端口未释放_工信部出手!对通信短信息和语音呼叫服务管理公开征求意见...
  18. 天气预报实时显示系统设计
  19. a padding to disable MSIE and Chrome friendly error page解决方案
  20. js 列表对象数据 转换成 excel格式数据

热门文章

  1. python size和count_groupby 的妙用(注意size和count)
  2. input type=date 移动端显示placeholder失效问题
  3. Python之魔法方法详解
  4. PCL之Ubuntu16.04下编译libfreenect2和PCL以支持KinectV2点云处理
  5. 天眼探空经济发展_“天眼”探空惊艳全球
  6. 取余运算怎么算_3 数学运算 矩阵操作
  7. spring cloud微服务分布式云架构-Spring Cloud 分布式的五大重点
  8. 毛发及眼球的渲染技术
  9. [Andriod设计模式之旅]——Builder模式
  10. Shell脚本学习-阶段六-密钥的批量分发与执行