关于C++宏:AFX_EXT_CLASS
本文原创版权归 网易博客 平淡生活 所有,如有转载,请以如下方式标明原创作者及出处,以示尊重!
作者:平淡生活
出处: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相关推荐
- MFC下DLL编程(图解)
DLL(Dynamic Link Library,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库.DLL是应用程序的一种扩展,也是软件共享和重用的传 ...
- VC++程序设计与应用--动态链接库
目录 前言 一.动态链接库 1.1 概述 1.1.1 动态链接库的概念 1.1.2 动态链接库和静态链接库的区别 1.1.3 使用动态链接库的优点 1.1.4 DLL文件的存放位置 1.2 创建MFC ...
- MFC AFX_EXT_CLASS
MFC扩展DLL是通常实现从现有Microsoft基础类库类派生的可重用类的DLL. MFC扩展DLL具有下列功能和要求: 1.客户端可执行文件必须是用定义的_AFXD ...
- AFX_EXT_CLASS的使用
如果要导出一个类(生成DLL提供给另外工程使用) 定义的时候加AFX_EXT_CLASS 并且在预定义配置项加上_AFXDLL 和 _AFXEXT 另个宏 参考:https://blog.csdn.n ...
- AFX_EXT_CLASS
MFC扩展DLL是通常实现从现有Microsoft基础类库类派生的可重用类的DLL. MFC扩展DLL具有下列功能和要求: 1.客户端可执行文件必须是用定义的_AFXD ...
- C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define
C/C++预处理器在源代码编译之前对其进行一些文本性质的操作. 它的主要任务包括删除注释 . 插入 #include 指令包含的文件的内容 . 定义和替换由 #defme 指令定义的符号以及确定代码的 ...
- OpenCV 笔记(04)— OpenCV2 升级到 OpenCV3/CV4 的改动(去掉 CV_前缀、使用新的前缀替换、使用新的命名空间宏)
1. 由于宏名称的变更照成的"未声明的标识符"系列问题 有时候,遇到此类问题加入一句 #include <cv.h> 便可以让 OpenCV3 或者 OpenCV4 也 ...
- TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成
TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成 这个PR增加了对分区.编译和运行TensorRT BYOC目标的支持. Building 有两个新的cmake标志: ...
- 打开word出现“您正试图运行的函数包含有宏或需要宏语言支持的内容。”的解决方法
1.Word选项→加载bai项→管理→转到--,转到→把勾勾都取消→确定即可. 2.工具→宏->安全性→可靠发行商,将下方的选择框中的钩清空,再将宏安全性改为最高. 3.可能是初次安装Offic ...
最新文章
- 好文推荐,15 分钟教你搞懂 Git!
- 架构模式_Index
- msflexgrid允许大选择_选择复式楼、跃层和别墅的装修业主如何做好家里的楼梯...
- Linux NULL定义
- 2014年自动化的个人感想
- 深度学习入门读书笔记:Day-14
- ASp.net常用服务
- 50套可视化报表模板直接用,做报告不用愁了!快收藏
- 这是一台家庭计算机重启无效,我买了一台二手计算机,配置还可以,但有时会自动重启机器,这是为什? 爱问知识人...
- poi实现Excel文件导出【SpringBoot篇】
- T410i升级i3 380M,上测试对比图,附拆机心得
- matlab入门基础函数
- MATLAB 批量下载网页中的数据
- pycharm如何正确打包ocr且让打包出来的exe尽量小
- 微信小程序,小游戏数据助手数据爬取!还敢随便授权小游戏吗?
- 自定义柱状图(水滴图)的填坑之路
- 服务停止端口未释放_工信部出手!对通信短信息和语音呼叫服务管理公开征求意见...
- 天气预报实时显示系统设计
- a padding to disable MSIE and Chrome friendly error page解决方案
- js 列表对象数据 转换成 excel格式数据
热门文章
- python size和count_groupby 的妙用(注意size和count)
- input type=date 移动端显示placeholder失效问题
- Python之魔法方法详解
- PCL之Ubuntu16.04下编译libfreenect2和PCL以支持KinectV2点云处理
- 天眼探空经济发展_“天眼”探空惊艳全球
- 取余运算怎么算_3 数学运算 矩阵操作
- spring cloud微服务分布式云架构-Spring Cloud 分布式的五大重点
- 毛发及眼球的渲染技术
- [Andriod设计模式之旅]——Builder模式
- Shell脚本学习-阶段六-密钥的批量分发与执行