MFC扩展DLL(转)

本文详细介绍了MFC扩展DLL的原理、特点和实现方式,包括MFC扩展DLL与MFC规则DLL的区别、如何导出MFC派生类、如何加载MFC扩展DLL(隐式和显式加载)、以及如何处理MFC扩展DLL之间的调用。通过具体示例展示了如何创建一个扩展DLL,导出对话框类,并在应用程序中使用。最后,文章提供了一个CStatic类的派生类CMultiColorStatic,增强了设置背景和文本颜色的功能,并给出了使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  6.1概论   MFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库,其不同点在于MFC扩展DLL与应用程序的接口可以是MFC的。MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC库类中派生出可重用的类。MFC扩展DLL使用MFC 动态链接库版本,因此只有用共享MFC 版本生成的MFC 可执行文件(应用程序或规则DLL)才能使用MFC扩展DLL。   从前文可知,MFC规则DLL被MFC向导自动添加了一个CWinApp的对象,而MFC扩展DLL则不包含该对象,它只是被自动添加了DllMain 函数。对于MFC扩展DLL,开发人员必须在DLL的DllMain函数中添加初始化和结束代码。   从下表我们可以看出三种DLL对DllMain入口函数的不同处理方式: DLL类型 入口函数 非 MFC DLL 编程者提供DllMain函数 MFC规则 DLL CWinApp对象的InitInstance 和 ExitInstance MFC扩展 DLL MFC DLL向导生成DllMain 函数   对于MFC扩展DLL,系统会自动在工程中添加如下表所示的宏,这些宏为DLL和应用程序的编写提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA这样的宏,在DLL和应用程序中将具有不同的定义,这取决于_AFXEXT宏是否被定义。这使得在DLL和应用程序中,使用统一的一个宏就可以表示出输出和输入的不同意思。在DLL中,表示输出(因为_AFXEXT被定义,通常是在编译器的标识参数中指定/D_AFXEXT);在应用程序中,则表示输入(_AFXEXT没有定义)。 宏 定义 AFX_CLASS_IMPORT __declspec(dllexport) AFX_API_IMPORT __declspec(dllexport) AFX_DATA_IMPORT __declspec(dllexport) AFX_CLASS_EXPORT __declspec(dllexport) AFX_API_EXPORT __declspec(dllexport) AFX_DATA_EXPORT __declspec(dllexport) AFX_EXT_CLASS #ifdef _AFXEXT  AFX_CLASS_EXPORT #else  AFX_CLASS_IMPORT AFX_EXT_API #ifdef _AFXEXT  AFX_API_EXPORT #else  AFX_API_IMPORT AFX_EXT_DATA #ifdef _AFXEXT  AFX_DATA_EXPORT #else  AFX_DATA_IMPORT   6.2 MFC扩展DLL导出MFC派生类   在这个例子中,我们将产生一个名为“ExtDll”的MFC扩展DLL工程,在这个DLL中导出一个对话框类,这个对话框类派生自MFC类CDialog。   使用MFC向导生成MFC扩展DLL时,系统会自动添加如下代码: static AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL }; extern "C" int APIENTRY DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved ) {  // Remove this if you use lpReserved  UNREFERENCED_PARAMETER( lpReserved );  //说明:lpReserved是一个被系统所保留的参数,对于隐式链接是一个非零值,对于显式链接值是零  if (dwReason == DLL_PROCESS_ATTACH)  {   TRACE0( "EXTDLL.DLL Initializing!/n" );   // Extension DLL one-time initialization   if ( !AfxInitExtensionModule( ExtDllDLL, hInstance ))    return 0;    // Insert this DLL into the resource chain   new CDynLinkLibrary( ExtDllDLL );  }  else if (dwReason == DLL_PROCESS_DETACH)  {   TRACE0( "EXTDLL.DLL Terminating!/n" );   // Terminate the library before destructors are called   AfxTermExtensionModule( ExtDllDLL );  }  return 1; // ok }   这一段代码含义晦涩,我们需要对其进行解读:   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值