字体
第(2/4)页
关灯
   存书签 书架管理 返回目录
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 调用约定。
上一页 目录 下一页