一.MFC规则DLL

    MFC规则DLL可以在该dll内部使用MFC,但是与应用程序的接口不能是MFC的。能够被所有支持dll的编程语言所写的应用程序使用,当然也包括使用MFC创建的应用程序。在这种动态链接库中包含一个从CWinApp中继承而来的类,DllMain函数也被隐藏在其中了。
   规则DLL包含俩类——静态链接到MFC上和动态连接到MFC上。静态链接到MFC上的规则DLL与MFC静态链接,将MFC的dll代码直接生成在该.dll中,在调用该dll时,使用的是该dll的资源句柄 ;动态链接到MFC上的规则DLL可以和使用它的应用程序同时动态链接到MFC的dll和MFC的扩展dll上,此时,MFC使用主应用程序的资源句柄加载资源模板,这样,如果主应用程序和dll中有相同的资源ID时,就出现了问题,此时需要进行模块转换,才能正确的家在资源。
     这里通过1.使用AFX_MANAGE_STATE(AfxGetStaticModuleState())作为接口的第一条语句进行模块状态转换;AFX_MOUDLE_STATE * AFXAPI AfxGetStaticModuleState(),该函数返回当前模块状态,AFX_MANAGE_STATE(AFX_MOUDLE_STATE * pMoudleState),该宏用于将pMoudleState设置为当前模块状态,当宏的作用域结束后,也就是离开pMoudleState所指向栈上对象的作用域时,AFX_MOUDLE_STATE的析构函数完成模块状态的恢复;
    2.AfxGetResourceHandle()//获取程序当前正在使用的模块句柄,AfxSetResourceHandle()//设置程序需要使用的模块句柄,在接口函数开始时进行模块状态转换,HINSTANCE old_hInstance=AfxGetResourceHandle(); AfxSetResourceHandle(当前dll的句柄,可以使用theApp.m_hInstance);后面是函数的其余部分,结尾处AfxSetResourceHandle(old_hInstance);将模块状态再次转换过来;该方法可以用在dll中,也可以用在应用程序调用该dll函数之前之后;
二.MFC的扩展DLL
    MFC的扩展DLL的内涵是MFC的扩展,用户使用MFC的扩展DLL就像使用MFC本身的DLL一样,除了可以在MFC的扩展DLL内部使用MFC外,MFC的扩展DLL与应用程序的接口也可以是MFC,一般使用MFC的扩展DLL来增强MFC的功能,使用vc++向导生成的MFC的扩展DLL会自动生成DllMain()函数。由MFC扩展的DLL导出的函数,变量和其他很相似,对于导出类,应该在声明类的前面加上AFX_EXT_CLASS。
在 DLL 的头文件中,将 AFX_EXT_CLASS 关键字添加到类的声明中,如下所示:
class AFX_EXT_CLASS CMyClass : public Cdocument {// <body of class>};
当定义了预处理 _AFXDLL 和 _AFXEXT 时,该宏被 MFC 定义为__declspec(dllexport)。 但当定义了 _AFXDLL 而未定义 _AFXEXT 时,该宏被定义为__declspec(dllimport)。定义后,预处理器符号 _AFXDLL 指示共享 MFC 版本正在由目标可执行文件(DLL 或应用程序)使用。当 _AFXDLL 和 _AFXEXT 都定义了时,这指示目标可执行文件是扩展 DLL。
 
本文转自http://yanguohong0925.blog.163.com/blog/static/928698420104129560808/

MFC的规则DLL与扩展DLL的更多相关文章

  1. 常规DLL与扩展DLL区别

    1.常规DLL可以被各种程序(python,VB等)调用,扩展DLL只能被MFC程序调用.提供给外部使用的控件类只能用扩展DLL. 2.扩展DLL的入口函数是DllMain(),而常规DLL入口是继承 ...

  2. 【逆向知识】开发WinDBG扩展DLL

    如何开发WinDbg扩展DLL WinDbg扩展DLL是一组导出的回调函数,用于实现用户定义的命令.以便从内存转储中提取特定的信息.扩展dll由调试器引擎加载,可以在执行用户模式或内核模式调试时提供自 ...

  3. VC++:创建,调用MFC动态链接库(扩展DLL)

    概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类. 仓库的发展史经历了"无库" ---& ...

  4. MFC的规则DLL中资源使用的问题

    今天刚刚做了一个静态链接到MFC的规则dll,即“Use MFC in a static library“,该dll用来显示一个窗体.然后在一个mfc可执行程序A.exe中调用这个dll文件,可以正常 ...

  5. 实现MFC扩展DLL中导出类和对话框

    如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,决定把重复用的类和对话框做到DLL中,下面就从一个简单的例子讲起,如何实现MFC扩展DLL中导出类和对 ...

  6. php 扩展dll

    一.准备工作: 注:php5.2没有vc9,php5.3.php5.4没有vc6.呵呵.PHP5.5开始,不支持xp和win2003了,更是vc11了.--------------->所以,扩展 ...

  7. 四种DLL:NON-MFC DLL, Regular DLL Statically/Dynamically Linked to MFC, MFC Extension DLL

    参考资料: https://msdn.microsoft.com/en-us/library/30c674tx.aspx http://www.cnblogs.com/qrlozte/p/484442 ...

  8. mfc extention dll 與 normal dll 的區別

    extention dll 1.指從MFC中繼承過來的DLL,一般要求使用共享MFC DLL進行連接,也要求調用者也使用MFC且使用共享MFC,如此可保證DLL與調用者有相同的MFC庫. 2.在使用資 ...

  9. fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC

    出现如下错误: fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires ...

随机推荐

  1. linux之centos安装xampp

    一.xampp下载地址: http://downloads.sourceforge.net/project/xampp/XAMPP%20Linux/5.5.19/xampp-linux-x64-5.5 ...

  2. javascript获取鼠标位置

    首先不同浏览器中event位置属性的分析: 1. IE的event.x,event.y是以事件触发元素的父元素外界为参考点(不包括滚动距离) 2. Firefox的event.pageX,event. ...

  3. USB相关知识

    USB基础知识概论 如何实现Linux下的U盘(USB Mass Storage)驱动: How to WriteLinux USB MSC (Mass Storage Class) Driver U ...

  4. The Famous Clock

    描述 Mr. B, Mr. G and Mr. M are now in Warsaw, Poland, for the 2012’s ACM-ICPC World Finals Contest. T ...

  5. Android图片选择器--仿QQ

    当做一款APP,需要选择本地图片时,首先考虑的无疑是系统相册,但是Android手机五花八门,再者手机像素的提升,大图无法返回等异常因数,导致适配机型比较困难,微信.QQ都相继的在自己的APP里集成了 ...

  6. ZOJ 3209 Treasure Map (Dancing Links)

    Treasure Map Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit S ...

  7. ip 子网掩码 网关 DNS

    这一篇文章也很好: 原文引用于:  http://www.cnblogs.com/jiqing9006/p/3365939.html 内外网ip: IP地址: IPv4地址分为A.B.C.D.E五类, ...

  8. AI 对不起 我还爱着你

    艾弗森,对不起,我还爱着你.有时候我自己都不知道自己我怎么了,直到最后才发现,我还爱着你. 那天起,我认识了你,便一发不可收拾.这些天,谢谢你,似乎因为你的影响让我改变了,坚持了许多.致以至今我才发现 ...

  9. Radware中APPDirector系列的Farm Table中的session mode参数说明

    Session mode中共有5种会话保持方式:1.Regular,是普通的会话保持,形成的表项是:Client ip+Server ip的形式2.EntryPerSession(EPS),是端口与i ...

  10. hdu 2412 树形DP

    思路:对于最大的人数很容易想到,就直接dp.但对于最大值是否唯一就需要应用辅助数组,isOnly[i][0]表示dp[i][0]是否唯一,同理isOnly[i][1]. 那么当(dp[v][0]> ...