毕业论文 - VC++环境下的动态链接库的开发与应用 下载本文

VC++环境下动态链接库的开发及应用

图 3-4-3 运行结果

(5)将RegularDll.dll和复制到RegularDll.lib 复制到CallRegDll工程 的debug目录下。

图 3-4-4 复制RegularDll.lib 和RegularDll.dll

再次编译,运行程序,结果如下:

21

VC++环境下动态链接库的开发及应用

图 3-4-5 运行结果

3.5. 隐式调用

上述例子中给出的是显式调用的方式,我们也可以在EXE程序中隐式调用MFC规则DLL。

(1)将DLL工程生成的.lib文件和.dll文件拷入当前工程所在的目录。

图 3-4-6 添加.lib文件和.dll文件

(2)并在CCallRegDllView.cpp文件 的顶部添加以下代码:

#pragma comment(lib,\ // extern \

22

VC++环境下动态链接库的开发及应用

(3)把消息响应函数CCallRegDllView::OnRegDll()修改为以下:

void CCallRegDllView::OnRegDll() { }

// TODO: Add your command handler code here ShowDlg(); (4)编译运行程序,同样能得到正确的结果。

图 3-4-7 运行结果

23

VC++环境下动态链接库的开发及应用

四、MFC扩展动态链接库的创建

4.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 MFC规则 DLL MFC扩展 DLL

对于MFC扩展DLL,系统会自动在工程中添加如下表所示的宏,这些宏为DLL和应

入口函数 编程者提供DllMain函数 CWinAppExitInstance MFC DLL向导生成DllMain 函数 对象的InitInstance 和 用程序的编写提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA这样的宏,在DLL和应用程序中将具有不同的定义,这取决于_AFXEXT宏是否被定义。这使得在DLL和应用程序中,使用统一的一个宏就可以表示出输出和输入的不同意思。

宏 AFX_CLASS_IMPORT AFX_API_IMPORT AFX_DATA_IMPORT AFX_CLASS_EXPORT AFX_API_EXPORT AFX_DATA_EXPORT 定义 __declspec(dllexport) __declspec(dllexport) __declspec(dllexport) __declspec(dllexport) __declspec(dllexport) __declspec(dllexport) #ifdef _AFXEXT AFX_EXT_CLASS AFX_CLASS_EXPORT #else AFX_CLASS_IMPORT

24