Windows_Dll编程_第1页
Windows_Dll编程_第2页
Windows_Dll编程_第3页
Windows_Dll编程_第4页
Windows_Dll编程_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Windows DLL 编程一、静态链接库1.创建一个“Win32 控制台应用程序”项目。项目名定义为staticdll。2. 在“应用程序设置”中配置为“静态库”,其他默认。3.向生成的项目中添加一个头文件和一个实现文件,名称分别为staticlib.h和staticlib.cpp。分别向这两个文中添加如下代码:/staticlib.h#ifndef LIB_H#define LIB_Hextern "C" int add(int x,int y); /声明为C编译、连接方式的外部函数#endif/staticlib.cpp#include "stdafx.h&

2、quot;#include "staticlib.h"int add(int x,int y)return x + y;4.编译链接后会在解决方案的根目录下的debug目录中得到一个staticdll.lib库文件。该文件就是静态库的关键文件。使用该库文件,将其编译链接到用户程序中,就可以调用在静态库中定义的导出函数add。5.测试静态库staticdll.lib。1)创建一个“win32控制台应用程序”项目。名称为:staticdlltest。2)配置“应用程序设置”为“控制台应用程序”,其他默认。3)在主staticdlltest.cpp文件中主要代码如下所示。/ St

3、aticDllTest.cpp : 定义控制台应用程序的入口点。/#include "stdafx.h"#include ".StaticDllstaticLib.h"#pragma comment(lib, ".debugstaticdll.lib")/指定与静态库一起连接int _tmain(int argc, _TCHAR* argv)printf( "2 + 3 = %dn", add( 2, 3 ) );return 0;二、Win32 动态链接库1. 创建一个“Win32 控制台应用程序”。名称为Non

4、MfcDll。2. 配置“应用程序设置”为“DLL”。3. 向生成的项目中添加一个头文件和一个实现文件,名称分别为nonmfclib.h和nonmfclib.cpp。分别向这两个文中添加如下代码:/NonMfcLib.h#ifndef LIB_H#define LIB_Hextern "C" _declspec(dllexport) int add(int x, int y);#endif/NonMfcLib.cpp#include "stdafx.h"#include "NonMfclib.h"int add(int x, int

5、y)return x + y;从以上代码中,可以看出我们在本项目中添加了一个导出函数add。4. 为了验证类的导出情况,我们再向本项目中添加一个C+类。名称为CmyClass。下面是该类的头文件及实现文件的具体代码。/CmyClass.h#pragma onceextern "C" _declspec(dllexport) void ext_hello();class _declspec(dllexport) CmyClasspublic:CmyClass(void);CmyClass(void);void Hello(void);/CmyClass.cpp#include

6、 "StdAfx.h"#include "CmyClass.h"#include <iostream>using namespace std;void ext_hello()CmyClass myCls;myCls.Hello();CmyClass:CmyClass(void)CmyClass:CmyClass(void)void CmyClass:Hello(void)cout << "大家好!" << endl;CmyClass类中包含了一个成员函数Hello。不过在用户函数中无法直接调用该函数

7、,必须使用另外一个类外部函数进行间接调用类成员函数。因此,添加了一个ext_hello函数用来间接调用一个CmyClass类的对象实例的Hello函数,来达到对类的成员函数的导出使用。5. 编译链接后会在解决方案的根目录下的debug目录中得到一个nonmfcdll.lib库文件和nonmfcdll.dll动态链接文件。Lib库文件用来进行静态导入,而dll用来动态导入。不过请注意这里的lib文件和静态库的lib文件是不一样的。这里的lib文件只包含了导出函数的接口说明,而真正的导出函数的执行体实际在dll文件中。6. 动态导入win32动态链接库。1) 创建一个“Win32控制台应用程序”项

8、目。名称为NonMfcDlltest。2) 配置“应用程序设置”为“控制台程序”,其他默认。3) 在NonMfcDlltest.cpp文件的代码如下所示:/ NonMfcDllTest.cpp : 定义控制台应用程序的入口点。/#include "stdafx.h"#include <Windows.h>typedef int(*lpAddFun)(int,int);int _tmain(int argc, _TCHAR* argv)HINSTANCE hDll;lpAddFun addFun;lpHelloFun helloFun;hDll = LoadLib

9、rary(_T(".DebugNonMfcDll.dll");if (hDll != NULL)addFun = (lpAddFun)GetProcAddress(hDll,"add");if (addFun != NULL)int result = addFun(2,3);printf("%dn",result);FreeLibrary(hDll);return 0;由上述代码可以总结动态链接库的动态导入的基本步骤大致如下:l 定义一个需要导入的动态链接库导出函数的函数指针类型;l 使用LoadLibrary函数动态加载动态链接库;

10、l 使用GetProcAddress函数获取动态链接库导出函数地址;l 使用函数;l 使用FreeLibrary函数释放动态链接库;4) 采用动态导入方式,只能通过间接使用类外部函数来调用类的成员。不能直接在用户程序中直接使用类的对象来调用成员。7. 静态导入Win32动态链接库1) 创建一个“Win32控制台应用程序”项目。名称为NonMfcDllStaticCall。2) 配置“应用程序设置”为“控制台程序”,其他默认。3) 在NonMfcDllStaticCall.cpp文件的代码如下所示:#include "stdafx.h"#include "CmyCl

11、ass.h"#pragma comment(lib,".debugNonMfcDll.lib")extern "C" _declspec(dllimport) int add(int x,int y);int _tmain(int argc, _TCHAR* argv)int result = add(2,3); printf("%dn",result);CmyClass myCls;myCls.Hello();return 0;这里需要注意的是,必须将动态链接库中定义的类的头文件拷贝到测试项目的根目录下,并且在项目主CPP

12、文件中将该头文件包含。然后,使用#pragma comment指示编译器静态链接动态链接库到项目中,并将需要导入的函数接口在主CPP文件中进行声明。三、MFC 常规动态链接库1创建一个“MFC DLL”项目。名称为 StaticMfcRegularDll。2. 配置“应用程序设置”为“带静态链接MFC的规则DLL”。3. 在MFC 规则DLL中导出函数,导出类的方法与前面介绍的Win32 DLL中的方法完全一致,因此,在此就不再进行说明。4. MFC DLL最大的特点就是可以使用MFC类库。因此,我们为项目添加一个ID为IDD_DIALOG1的对话框资源,然后为该对话框添加一个派生于CDial

13、og的类:CDllDlg。对话框资源,你可以根据你的需求定义。我们这里就进行最简单的布置为如下图的形式,以便在用户程序中调用时,明确这是来之DLL中的对话框资源。由于,MFC规则DLL不允许导出整个类,以及类的成员函数,所以,为了保证用户程序能够调用该对话框资源,因此,必须在类外部实现一个外部函数。具体代码如下所示:/StaticMfcRegularDll.hextern "C" void _declspec(dllexport)ShowDlg();/StaticMfcRegularDll.cpp#include "DllDlg.h".void Show

14、Dlg()AFX_MANAGE_STATE(AfxGetStaticModuleState();CDllDlg dlg;dlg.DoModal();.上述代码所作的工作是:l 声明一个导出显示对话框的函数接口;l 将对话框的头文件包含如MFC规则DLL的主CPP文件中;l 定义显示对话框的函数;注意,建议在任何导出函数的函数体开始的位置加入:AFX_MANAGE_STATE(AfxGetStaticModuleState();以保证,不管MFC库是如何链接到本DLL文件中的,都可以保证找到该对话框资源。5. 编译链接后,该项目将生成两个主要输出文件:StaticMfcRegularDll.li

15、b和StaticMfcRegularDll.dll。6. 测试该MFC DLL,采用静态导入。1)创建一个MFC SDI应用程序项目。2)为了在测试项目中的任何派生类中都能导入到MFC Dll中的导出函数,我们在CWinApp派生类的头文件中添加以下代码:#pragma comment(lib,".debugStaticMfcRegularDll.lib")extern "C" _declspec(dllimport) void ShowDlg();从以上代码可知,我们在测试项目中采用的是静态导入方式。3)在测试项目中添加一个菜单资源,ID为ID_DLL

16、TEST_DLLDLG。并为该菜单添加一个命令处理程序,该处理程序添加给CFrameWnd派生类中。然后,在该处理程序的实现中添加对导入函数ShowDlg的调用,即可。void CMainFrame:OnDlltestDlldlg()/ TODO: 在此添加命令处理程序代码ShowDlg();7. 测试该MFC Dll,采用动态导入。1)MFC Dll的动态导入,与前面我们介绍的Win32 Dll的动态导入方式是相同的。下面,就在静态导入测试项目的基础上,来实现对函数ShowDlg的动态导入。2)我们要做两件的事情,就是定义一个与ShowDlg函数的对应的函数指针类型,然后修改前面的那个菜单资

17、源的命令处理程序的实现。下面这行代码,加入到CWinApp派生类的头文件中。typedef void(*ShowDlg)(void);下面,是新的菜单命令处理函数void CMainFrame:OnDlltestDlldlg()/ TODO: 在此添加命令处理程序代码HINSTANCE hDll;ShowDlg pSDlg;hDll = LoadLibrary(_T(".debugStaticMfcRegularDll.dll");if (hDll != NULL)pSDlg = (ShowDlg)GetProcAddress(hDll,"ShowDlg"

18、;);if (pSDlg != NULL)pSDlg();FreeLibrary(hDll);四、MFC 扩展动态链接库MFC 扩展DLL与MFC 规则DLL的主要区别是,对于有MFC类派生的派生类,MFC扩展DLL可以导出整个类,而MFC规则DLL则不行。1) 创建一个“MFC DLL”项目。名称为 MfcExtDll;2) 配置“应用程序设置”为 “MFC 扩展DLL”;3) 为项目添加一个对话框资源,ID为:IDD_DIALOG1;4) 为该对话框资源添加一个派生于CDialog的MFC派生类。类名为CMyDllDlg;5) 修改CMyDllDlg类的头文件中,类的接口声明。class

19、AFX_EXT_CLASS CMyDllDlg : public CDialog在Class 向导自动生成的代码基础上,仅是在class关键字和类名之间添加上AFX_EXT_CLASS。6) 由于,导入MFC扩展DLL的对话框类时,要求用户测试程序必须包含类的头文件,又因为对话框的头文件中包含了对话框的资源ID,因此在用户测试文件中还必须包含资源的头文件resource.h。由于,用户测试程序中也会包含资源头文件resource.h,为了避免同一项目文件重名的冲突,因此,这里需要修改DLL项目中的资源头文件名。按照上图所示,打开MfcExtDll.rc资源文件。会看到如下形式的代码内容:/ Microsoft Visual C+ generated resourc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论