DLL 文件长度大,一般不使用这种方式;
后者使用MFC 的动态链接库,生成的DLL 文件长度小。动态链接到MFC 的规则DLL 所有
输出的函数应该以如下语句开始:
AFX_MANAGE_STATE(AfxGetStaticModuleState()) //此语句用来正确地切换MFC 模块状态
最后一种是MFC 扩展DLL,这种DLL 特点是用来建立MFC 的派生类,DLL 只被用
MFC 类库所编写的应用程序所调用。前面已经介绍过,Extension DLLs 和Regular DLLs 不
一样,它没有一个从CWinApp 继承而来的类的对象,编译器默认了一个DLL 入口函数
DLLMain()作为对DLL 的初始化,可以在此函数中实现初始化,代码如下:
BOOL WINAPI APIENTRY DLLMain(HINSTANCE hinstDll,DWORD reason,LPVOID flmpload)
{
switch(reason)
{
?????//初始化代码;
}
return true;
}
参数hinstDll 表示存放DLL 的句柄,参数reason 指明调用函数的原因。对于隐式链接是
一个非零值,对于显式链接值是零。
在MFC 下建立DLL 文件,会自动生成def 文件框架,其他与建立传统的Non-MFC DLL
没有什么区别,只要在相应的头文件写入关键字_declspec(dllexport)函数类型和函数名等,或
在生成的def 文件中EXPORTS 下输入函数名就可以了。需要注意的是在向其他开发人员分
发MFC 扩展DLL 时,不要忘记提供描述DLL 中类的头文件以及相应的LIB 文件和DLL 本
身,此后开发人员就能充分利用开发的扩展DLL 了。
10.4.3 导出函数调用约定
关于动态链接库输出函数的约定有调用约定和名字修饰约定两种。调用约定决定着函数
参数传送时入栈和出栈的顺序,以及编译器用来识别函数名字的修饰约定。名字修饰约定随
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·262·
调用约定和编译种类(C 或C++)的不同而变化。为了让不同的编程语言共享动态链接库带
来的方便,函数输出时必须使用正确的调用约定,并且最好不带有任何由编译器生成的名字
修饰。下面详细介绍实现这些需求的方法。
1.调用约定
Visual C++ 6.0 支持的函数调用约定有多种,在这里主要介绍_stdcall 调用约定、C 调用约
定和_fastcall 调用约定。
_stdcall 调用约定相当于16 位动态库中经常使用的PASCAL 调用约定。在32 位的Visual
C++ 6.0 中PASCAL 调用约定不再被支持(实际上它已被定义为_stdcall。除了_pascal 外,
_fortran 和_syscall 也不被支持),取而代之的是_stdcall 调用约定。