WEB开发网
开发学院软件开发VC MFC教程(7)-- MFC的DLL 阅读

MFC教程(7)-- MFC的DLL

 2010-03-25 20:35:12 来源:WEB开发网   
核心提示:表7-1显示了一个函数在几种调用约定下的修饰名(表中的“C++”函数指的是“C++”全局函数,不是成员函数),MFC教程(7)-- MFC的DLL(4),函数原型是void CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_

表7-1显示了一个函数在几种调用约定下的修饰名(表中的“C++”函数指的是“C++”全局函数,不是成员函数),函数原型是void CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_stdcall。

表7-1 不同调用约定下的修饰名

调用约定 extern “C”或.C文件 .cpp, .cxx或/TP编译开关
_cdecl _test ?test@@ZAXXZ
_fastcall 0 ?test@@YIXXZ
_stdcall _test@0 ?test@@YGXXZ

MFC的DLL应用程序的类型

静态链接到MFC的规则DLL应用程序

该类DLL应用程序里头的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。输入函数有如下形式:

extern "C" EXPORT YourExportedFunction( );

如果没有extern “C”修饰,输出函数仅仅能从C++代码中调用。

DLL应用程序从CWinApp派生,但没有消息循环。

动态链接到MFC的规则DLL应用程序

该类DLL应用程序里头的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。但是,所有从DLL输出的函数应该以如下语句开始:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

此语句用来正确地切换MFC模块状态。关于MFC的模块状态,后面第9章有详细的讨论。

其他方面同静态链接到MFC的规则DLL应用程序。

扩展DLL应用程序

该类DLL应用程序动态链接到MFC,它输出的函数仅可以被使用MFC且动态链接到MFC的应用程序使用。和规则DLL相比,有以下不同:

它没有一个从CWinApp派生的对象;

它必须有一个DllMain函数;

DllMain调用AfxInitExtensionModule函数,必须检查该函数的返回值,如果返回0,DllMmain也返回0;

如果它希望输出CRuntimeClass类型的对象或者资源(Resources),则需要提供一个初始化函数来创建一个CDynLinkLibrary对象。并且,有必要把初始化函数输出。

使用扩展DLL的MFC应用程序必须有一个从CWinApp派生的类,而且,一般在InitInstance里调用扩展DLL的初始化函数。

为什么要这样做和具体的代码形式,将在后面9.4.2节说明。

MFC类库也是以DLL的形式提供的。通常所说的动态链接到MFC 的DLL,指的就是实现MFC核心功能的MFCXX.DLL或者MFCXXD.DLL(XX是版本号,XXD表示调试版)。至于提供OLE(MFCOXXD.DLL或者MFCOXX0.DLL)和NET(MFCNXXD.DLL或者MFCNXX.DLL)服务的DLL就是动态链接到MFC核心DLL的扩展DLL。

其实,MFCXX.DLL可以认为是扩展DLL的一个特例,因为它也具备扩展DLL的上述特点。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:MFC 教程 MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接