收藏 分享(赏)

MFC下DLL编程(图解).doc

上传人:hwpkd79526 文档编号:6628472 上传时间:2019-04-18 格式:DOC 页数:20 大小:413.50KB
下载 相关 举报
MFC下DLL编程(图解).doc_第1页
第1页 / 共20页
MFC下DLL编程(图解).doc_第2页
第2页 / 共20页
MFC下DLL编程(图解).doc_第3页
第3页 / 共20页
MFC下DLL编程(图解).doc_第4页
第4页 / 共20页
MFC下DLL编程(图解).doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、MFC 下 DLL 编程(图解)DLL(Dynamic Link Library,动态链接库)是微软公司为 Windows 和 OS/2 操作系统设计一种供应用程序在运行时调用的共享函数库。DLL 是应用程序的一种扩展,也是软件共享和重用的传统方法。DLL 除了可同时被多个应用程序共享外,还可以在不改变调用接口(从而不需修改使用它的应用程序)的情况下,改进和升级里面的库函数。而且 DLL 与编写它的语言无关,例如,用 VC 生成的规则 DLL,可以被 VB、Delphi 等生成的应用程序使用。DLL 可以用多种语言和工具编写,我们这里只介绍如何使用 MFC 来编写和使用DLL。相关说明文档位于

2、 MSDN 帮助的“目录 开发工具和语言Visual StudioVisual C+常见编程方法DLL”中。8.1 基础本节先讨论 DLL 与静态库的区别,然后列出几种适合放置 DLL 的目录,最后介绍MFC DLL 的三种类型。8.1.1 DLL 与静态链接库静态链接库 Lib(Static Link Library) ,是在编译的链接阶段将库函数嵌入到应用程序的内部。如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造成很大的浪费。这样即增加了链接器的负担,也增大了可执行程序的大小,还加大了内存的消耗。Lib 的好处是应用程序可以独立运行,而不需要在操作系统中另外安装对应的 DL

3、L。而 DLL 采用动态链接,对公用的库函数,系统只有一个拷贝(一般是位于系统目录的*.DLL 文件) ,而且只有在应用程序真正调用时,才加载到内存。在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。参见图 8-1。运行时调用运行时调用 编译器编译时链接应用程序(*.exe)#include fun();fun() 静态库(*.lib)fun() 操作系统运行时链接应用程序(*.exe)#include fun();fun() 动态链接库 (*.dll)fun() 使用静态库函数 使用动态链接库图 8-1 静态库

4、函数与动态链接库的区别DLL 的缺点是应用程序不能独立运行,需要在操作系统中另外安装对应的 DLL。例如,如果你的 MFC 项目被设置成“在共享 DLL 中使用 MFC”的,则虽然生成的可执行程序很小,但是在其他没有安装 Visual C+(运行环境)的机器上是不能直接运行的,需要另外安装 MFC 的动态链接库(如 mfc90.dll) 。8.1.2 放置 DLL 的目录为了使需要动态链接库的应用程序可以运行,需要将 DLL 文件放在操作系统能够找到的地方。Windows 操作系统查找 DLL 的目录顺序为:1. 所在目录当前进程的可执行模块所在的目录,即应用程序的可执行文件(*.exe)所在

5、的目录。2. 当前目录进程的当前目录。3. 系统目录Windows 操作系统安装目录的系统子目录,如 C:Windows System32。可用 GetSystemDirectory 函数检索此目录的路径。4. Windows 目录Windows 操作系统安装目录,如 C:Windows。可用GetWindowsDirectory 函数检索此目录的路径。5. 搜索目录PATH 环境变量中所包含的自动搜索路径目录,一般包含C:Windows和 C:WindowsSystem32等目录。可在命令行用 Path 命令来查看和设置,也可以通过(在“我的电脑”右键菜单中选“属性”菜单项) “系统属性”中

6、的环境变量,来查看或编辑“Path ”系统变量和“PATH”用户变量。8.1.3 MFC DLL 的类型使用 MFC 编写的 DLL,可以分成两大类:规则 DLL规则(regular)DLL 中所包含的函数,可以被所有 Windows 应用程序使用; 共享 MFCDLL 中不包含 MFC 库函数,需要另外安装 MFC 动态链接库后才能使用; 静态 MFCDLL 中包含 MFC 库函数,可以脱离 MFC 动态链接库独立使用。扩展 DLL扩展(extension)DLL 中所定义的类和函数,只能被所 MFC 应用程序使用。而且扩展 DLL 中不能包含 MFC 库函数,也需要另外安装 MFC 动态链

7、接库后才能使用。8.1.4 导出函数的方法使用 MFC 创建 DLL 时,从项目中导出( export)函数到 DLL 文件的方法有:使用模块定义文件(.def)。使用_declspec(dllexport)关键字或其替代宏 AFX_EXT_CLASS。这两种方法是互斥的,对每个函数只需用一种方法即可。另外,DEF 文件只能用来导出函数,不能用于导出整个类。导出 C+类,必须用_declspec(dllexport) 关键字或其替代宏AFX_EXT_CLASS。1DEF 文件模块定义(module definition)文件(.def)是包含一个或多个描述 DLL 各种属性的模块语句的文本文件

8、。DEF 文件必须至少包含下列模块定义语句:文件中的第一个语句必须是 LIBRARY 语句。此语句将.def 文件标识为属于DLL。LIBRARY 语句的后面是 DLL 的名称(缺省为 DLL 项目名) 。链接器将此名称放到 DLL 的导入库中。EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。即,DEF 文件的格式为:(在这两个语句之间,还可以加上可选的描述语句:DESCRIPTION “库描述串“。分号;后的文本内容行为注释)

9、; 库名.defLIBRARY 库名EXPORTS函数名 1 1函数名 2 2函数名 n n在使用 MFC DLL 向导创建 MFC DLL 项目时,VC 会自动创建一个与项目同名但没有任何函数导出项的 DEF 文件(项目名.def) ,格式为:; 项目名.def : 声明 DLL 的模块参数。LIBRARY “项目名“EXPORTS; 此处可以是显式导出例如,项目名为 RegDll 的 DEF 文件(RegDll.def)的内容为:; RegDll.def : 声明 DLL 的模块参数。LIBRARY “RegDll“EXPORTS; 此处可以是显式导出如果生成扩展 DLL 并使用.def

10、文件导出,则将下列代码放在包含导出类的头文件的开头和结尾:#undef AFX_DATA#define AFX_DATA AFX_EXT_DATA/ #undef AFX_DATA#define AFX_DATA这些代码行确保内部使用的 MFC 变量或添加到类的变量是从扩展 DLL 导出(或导入)的。例如,当使用 DECLARE_DYNAMIC 派生类时,该宏扩展以将 CRuntimeClass 成员变量添加到类。省去这四行代码可能会导致不能正确编译或链接 DLL,或在客户端应用程序链接到 DLL 时导致错误。当生成 DLL 时,链接器使用.def 文件创建导出(.exp) 文件和导入库(.l

11、ib)文件。然后,链接器使用导出文件生成 DLL 文件。隐式链接到 DLL 的可执行文件在生成时链接到导入库。请注意,MFC 本身就是使用.def 文件从 MFCx0.dll 导出函数和类的。2关键字或宏除了使用 DEF 文件来导出函数外,还可以在源程序中使用_declspec(dllexport)关键字或其替代宏 AFX_EXT_CLASS:#define AFX_EXT_CLASS AFX_CLASS_EXPORT (定义在头文件 afxv_dll.h 中)#define AFX_CLASS_EXPORT _declspec(dllexport) (定义在头文件 afxver_.h中)来导

12、出函数和整个 C+类。具体的格式为:导出整个类:class AFX_EXT_CLASS 类名 : public 基类导出类的成员函数:class 类名 : public 基类AFX_EXT_CLASS 返回类型 函数名 1() ;AFX_EXT_CLASS 返回类型 函数名 2() ;导出外部 C 格式的(全局)函数:extern “C“ _declspec(dllexport) 返回类型 函数名() 如果希望用 MFC(C+)编写的规则 DLL 中的函数,也能够被非 MFC 程序来调用,需要为函数声明指定 extern “C“。不然,C+编译器会使用 C+类型安全命名约定(也称作名称修饰)和

13、 C+调用约定(使用此调用约定从 C 调用会很困难) 。为了使用方便,可以定义宏:#define DllExport extern “C“ _declspec(dllexport)然后再使用它,例如:DllExport int Add(int d1, int d2) 8.2 扩展 DLL使用 MFC 编写的扩展 DLL,可以导出整个类(从而能使用类中的所有成员,包括数据成员和成员函数) ,也可以导出指定的若干(成员或全局)函数。下面我们通过一个四则运算的例子,看看如何用宏 AFX_EXT_CLASS 来编写和使用导出整个 C+类的扩展 MFC DLL。8.2.1 创建 DLL 项目我们创建一个

14、名为 ExtDll 的扩展 DLL 的“Visual C+”之“MFC”的“MFC DLL”项目,注意需选中“创建解决方案的目录”复选框,参见图 8-2。图 8-2 新建 MFC DLL 项目 ExtDll 的对话框按“确定”钮,弹出“MFC DLL 向导”对话框。在“DLL 类型”栏中,选中“扩展DLL”单选钮,参见图 8-3。按“完成”钮,创建 ExtDll 解决方案和项目。图 8-3 选择“扩展 DLL”的 MFC DLL 向导对话框8.2.2 添加导出类为新项目添加用于四则计算的导出类 CCompute。方法有多种,可以在项目管理区的“类视图”页中,选中项目名“ExtDll” ,按鼠标

15、右键,在弹出菜单中选“添加 类” 。在弹出的“添加类”对话框中,选择“Visual C+”之“MFC ”的“MFC 类”项,参见图 8-4。图 8-4 添加类对话框按“添加”钮,弹出“MFC 类向导”对话框。在“类名” 栏中键入“CCompute ”,在“基类”下拉式列表,选“CObject” ,参见图 8-5。按“完成”钮,添加该类到 ExtDll 项目。图 8-5 MFC 类向导对话框8.2.3 编写导出类代码我们将整个 CCompute 类设为导出类,并在里面添加 2 个成员变量、1 个构造函数和4 个用于四则运算的成员函数,外加 1 个演示导出函数的取模全局函数 Mod。下面是 CCo

16、mpute 类的头文件(Compute.h) ,其中红色的部分是自己添加:(注意导出宏 AFX_EXT_CLASS 的使用)#pragma once/ CCompute 命令目标class AFX_EXT_CLASS CCompute : public CObjectpublic:int m_data1, m_data2;public:CCompute();CCompute(int d1, int d2);virtual CCompute();public:int Add();int Sub();int Mul();double Div();AFX_EXT_CLASS int Mod(int

17、d1, int d2);下面是 CCompute 类的代码源文件(Compute.cpp) ,其中红色为自己添加的部分:/ Compute.cpp : 实现文件/#include “stdafx.h“#include “Compute.h“/ CComputeCCompute:CCompute()CCompute:CCompute(int d1, int d2)m_data1 = d1;m_data2 = d2;CCompute:CCompute()/ CCompute 成员函数int CCompute:Add()return m_data1 + m_data2;int CCompute:Su

18、b()return m_data1 - m_data2;int CCompute:Mul()return m_data1 * m_data2;double CCompute:Div()if (m_data2 = 0 ) AfxMessageBox(L“Divided by zero!“);return 0;return (double)m_data1 / m_data2;int Mod(int d1, int d2)if (d2 = 0 ) AfxMessageBox(L“Modulo by zero!“);return 0;return d1 % d2;编译运行时,后弹出图 8-6 所示的对

19、话框:图 8-6 调试会话的可执行文件对话框要求你选择或输入使用此 DLL 的应用程序之可执行文件的名称或路径。这是因为 DLL 虽然包含了可运行函数的二进制代码,但是它并不是独立的应用程序,不能单独运行。因此,我们必须编写使用 DLL 的客户程序。8.2.4 添加客户程序项目为了演示扩展 DLL 的应用,我们在原解决方案 ExtDll 中,添加一个客户程序项目ExtClient。具体做法是,打开新建项目对话框,选中 “Visual C+”之“MFC ”的“MFC应用程序”模板,键入项目名 ExtClient。注意,需选在对话框底部的“解决方案”下拉式列表中选中“添入解决方案”表项,参见图 8

20、-7。图 8-6 新建客户程序项目的对话框按“确定”钮进入“MFC 应用程序向导”对话框,在“应用程序类型 ”页,选中“基于对话框”单选钮,按“完成”添加项目。此时,ExtDll 解决方案包含两个项目:DLL 项目 ExtDll 和客户程序项目 ExtClient,生成的文件目录结构为:ExtDll 解决方案目录Debug 解决方案的调试目录Release 解决方案的发行目录ExtDll DLL 项目目录Debug DLL 的调试目录Release DLL 的发行目录res DLL 的资源目录ExtClient 客户程序项目目录Debug 客户程序的调试目录Release 客户程序的发行目录r

21、es 客户程序的资源目录8.2.5 设置依赖项为了使客户程序可以调用 DLL,需要将它们关联起来。最简单的办法是设置 DLL 项目为客户项目的依赖项。具体做法是,在项目管理区中选中客户项目名“ExtClient” ,选中菜单项“项目项目依赖项” ,在弹出的 “项目依赖项”对话框中,选中“依赖栏”中的“ExtDll”复选框,参见图 8-7。图 8-7 设置 ExtClient 项目依赖项的对话框8.2.6 编写客户程序代码1编辑对话框资源添加表示操作数的 2 个静态文本框和 2 个文本编辑框(ID 值分别为 IDC_DATA1 和IDC_DATA2) 、 5 个表示四则运算和取模运算的按钮(ID

22、 值分别为IDC_ADD、IDC_SUB、IDC_MUL、IDC_DIV 和 IDC_MOD) 、表示计算结果的 1 个静态文本框和 1 个文本编辑框(ID 值为 IDC_RESULT) ,删除原来 “确定”按钮,将原来的“取消”按钮的“Caption”属性值改为“退出” ,参见图 8-8。图 8-8 客户程序的对话框界面2添加控件变量为了动态获取用户输入的数据,我们需要为 2 个表示操作数据的文本编辑框,添加控件的 Value 值类别 int 型变量 m_iData1 和 m_iData2。3添加事件处理分别对 5 个计算按钮,为对话框类 CExtClientDlg 添加按钮通知消息BN_C

23、LICKED(鼠标单击)事件的处理程序 OnBnClickedAdd 等。4编写代码为了让客户程序可以使用 DLL 项目中的计算类 CCompute,需要在客户程序对话框类CExtClientDlg 的头文件的头部添加包含语句:#include “ExtDllCompute.h“在对话框类的定义中,手工添加公共型类变量和成员函数:public:CCompute *m_pComp;void Comp(UINT nID);最后的头文件为:(其中绿色为向导添加的,红色为手工添加的)/ ExtClientDlg.h : 头文件/#include “ExtDllCompute.h“#pragma onc

24、e/ CExtClientDlg 对话框class CExtClientDlg : public CDialogpublic:int m_iData1;int m_iData2;CCompute *m_pComp;void Comp(UINT nID);afx_msg void OnBnClickedAdd();afx_msg void OnBnClickedSub();afx_msg void OnBnClickedMul();afx_msg void OnBnClickedDiv();afx_msg void OnBnClickedMod(); ;在客户对话框类的初始化对话框成员函数 On

25、InitDialog 中,手工添加设置数据编辑框初值的代码(红色部分):BOOL CExtClientDlg:OnInitDialog()CDialog:OnInitDialog();/ TODO: 在此添加额外的初始化代码SetDlgItemInt(IDC_DATA1, 5);SetDlgItemInt(IDC_DATA2, 3);return TRUE; / 除非将焦点设置到控件,否则返回 TRUE代码文件 ExtClientDlg.cpp 中其他新加内容有:(其中红色部分为手工添加的)void CExtClientDlg:OnBnClickedAdd()/ TODO: 在此添加控件通知处

26、理程序代码Comp(IDC_ADD);void CExtClientDlg:OnBnClickedSub()/ TODO: 在此添加控件通知处理程序代码Comp(IDC_SUB);void CExtClientDlg:OnBnClickedMul()/ TODO: 在此添加控件通知处理程序代码Comp(IDC_MUL);void CExtClientDlg:OnBnClickedDiv()/ TODO: 在此添加控件通知处理程序代码Comp(IDC_DIV);void CExtClientDlg:OnBnClickedMod()/ TODO: 在此添加控件通知处理程序代码Comp(IDC_MO

27、D);void CExtClientDlg:Comp(UINT nID)UpdateData(); / 动态获取用户输入的数据并赋值给对应的控件变量m_pComp = new CCompute(m_iData1, m_iData2); / 创建计算对象int r;double dr;switch(nID) / 进行四则和取模运算case IDC_ADD: r = m_pComp-Add(); break;case IDC_SUB: r = m_pComp-Sub(); break;case IDC_MUL: r = m_pComp-Mul(); break;case IDC_DIV: dr =

28、 m_pComp-Div(); break;case IDC_MOD: r = Mod(m_iData1, m_iData2); break;delete m_pComp;if (nID != IDC_DIV) SetDlgItemInt(IDC_RESULT, r); / 显示整数结果else / 显示除法所得的实数结果wchar_t buf20;swprintf_s(buf, 20, L“%g“, dr);SetDlgItemText(IDC_RESULT, buf);8.2.7 编译运行为了运行客户程序,需要将客户程序项目设置成启动项目。具体做法是,先在项目管理区中选中 ExtClien

29、t 项目,然后选择菜单项 “项目设为启动项目” 。编译后,会在解决方案的 Debug 或 Release 目录中生成动态链接库文件 ExtDll.dll 和客户程序的可执行文件 ExtClient.exe,以及 DLL 的导出文件 ExtDll.exp 和(静态连接)库文件 ExtDll.lib。运行结果如图 8-9 所示:图 8-9 客户程序 ExtClient 的运行结果8.3 规则 DLL使用 MFC 编写的规则 DLL,虽然只能导出函数而不能导出整个类,但是其导出的函数却可以其他被非 MFC 应用程序所调用。下面我们仍通过上面的四则运算的例子,看看如何用关键字_declspec(dll

30、export)和 extern “C“来编写和使用导出若干(全局)C 函数的规则 MFC DLL。8.3.1 创建 DLL 项目我们创建一个名为 RegDll 的规则 DLL 的“Visual C+”之“MFC ”的“MFC DLL”项目,注意仍需选中“创建解决方案的目录”复选框,参见图 8-10。图 8-10 新建 MFC DLL 项目 RegDll 的对话框按“确定”钮,弹出“MFC DLL 向导”对话框。在“DLL 类型”栏中,选中“使用共享 MFC DLL 的规则 DLL”单选钮,参见图 8-11。按“完成”钮,创建 RegDll 解决方案和项目。图 8-11 选择规则 DLL 的 M

31、FC DLL 向导对话框也可以选择“带静态链接 MFC 的规则 DLL”,差别是所生成的 DLL 中会包含 MFC 库,当然所生成的库文件也会大一些(但因此可不用另外安装 MFC 动态链接库) 。例如,在此例中,选共享 MFC 所生成的 RegDll.dll 文件只有 13KB 大,而选择静态 MFC 的则有199KB。规则 DLL 项目是使用共享 MFC 还是使用静态 MFC,也可以在生成 DLL 项目之后,通过项目属性对话框的“配置属性常规”页中的“MFC 的使用”栏中的下拉式列表选项来切换,这一点与普通 MFC 应用程序项目的类似。8.3.2 使用 DEF 文件导出函数1编辑 DEF 文

32、件在项目管理区中,选择“解决方案资源管理器”页,展开“RegDll”项目项,双击其“RegDll.def”子项,打开 DLL 项目中自动生成的 DEF 文件。在该 DEF 文件中加入需要导出的 5 个函数项:(红色部分为手工添加的); RegDll.def : 声明 DLL 的模块参数。LIBRARY “RegDll“EXPORTS; 此处可以是显式导出Add 1Sub 2Mul 3Div 4Mod 52编写导出函数代码可以在 RegDll 项目的应用程序类的代码文件 RegDll.cpp 的尾部手工添加如下代码:extern “C“ int Add(int d1, int d2) retur

33、n d1 + d2;extern “C“ int Sub(int d1, int d2) return d1 - d2;extern “C“ int Mul(int d1, int d2) return d1 * d2;extern “C“ double Div(int d1, int d2) if (d2 = 0) AfxMessageBox(L“Divided by zero!“);return 0;return (double)d1 / d2;extern “C“ int Mod(int d1, int d2) return d1 % d2;注意,函数前的 extern “C“是不可少的

34、,它指定按 C 语言约定来生成导出函数。不然,缺省情况下,C+编译器会生成冗长的函数修饰符,不能简单地用函数名来调用。8.3.3 使用关键字_declspec(dllexport)导出函数也可以不修改 DEF 文件,而在代码文件中直接用关键字_declspec(dllexport)和 extern “C“来指定导出函数。对应的代码为:(也加在 RegDll.cpp 的尾部)#define DllExport extern “C“ _declspec(dllexport)DllExport int Add(int d1, int d2) return d1 + d2;DllExport int

35、Sub(int d1, int d2) return d1 - d2;DllExport int Mul(int d1, int d2) return d1 * d2;DllExport double Div(int d1, int d2) if (d2 = 0) AfxMessageBox(L“Divided by zero!“);return 0;return (double)d1 / d2;DllExport int Mod(int d1, int d2) if (d2 = 0) AfxMessageBox(L“Modulo by zero!“);return 0;return d1 %

36、 d2;8.3.4 编写客户程序1添加客户程序项目与上节类似,为例演示 DLL 的调用,我们也为 RegDLL 解决方案添加一个客户程序基于对话框的 MFC 应用程序项目 RegClient,参见图 8-12。图 8-12 添加客户程序项目 RegClient 的对话框2设置依赖项我们也通过设置 DLL 项目为客户项目的依赖项将 RegClient 与 RegDll.dll 关联起来,参见图 8-13。图 8-13 设置 RegClient 项目依赖项的对话框3编辑对话框资源为了节省时间,避免重复劳动,可以复制 ExtClient 项目中的对话框。具体做法是:在 RegDll 解决方案环境中打

37、开 ExtDll 解决方案中 ExtClient 项目的资源文件 ExtClient.rc 文件, (用鼠标或按 Ctrl + A 组合键)选中其主对话框中的所有控件, (按 Ctrl + C 或 Ctrl + Insert 组合键)复制它们到剪接板。然后打开 RegClient 项目的主对话框编辑器,先删除其中的所有控件,然后再粘贴剪接板中的控件到对话框,参见图 8-8。4编写代码类似 ExtClient 程序,我们也需要为 2 个数据编辑框添加类变量,并逐个为运算符按钮添加单击事件处理函数。在头文件 RegClientDlg.h 的尾部会出现如下代码:(其中红色的Comp 函数原型是手工添

38、加的)public:int m_iData1;int m_iData2;void Comp(UINT nID);afx_msg void OnBnClickedAdd();afx_msg void OnBnClickedSub();afx_msg void OnBnClickedMul();afx_msg void OnBnClickedDiv();afx_msg void OnBnClickedMod();在客户对话框类的初始化对话框成员函数 OnInitDialog 中,手工添加设置数据编辑框初值的代码(红色部分):BOOL CRegClientDlg:OnInitDialog()CDia

39、log:OnInitDialog();/ TODO: 在此添加额外的初始化代码SetDlgItemInt(IDC_DATA1, 5);SetDlgItemInt(IDC_DATA2, 3);return TRUE; / 除非将焦点设置到控件,否则返回 TRUE对应的代码文件 RegClientDlg.cpp 尾部新增的代码为:(其中红色部分是手工添加的)void CRegClientDlg:OnBnClickedAdd()/ TODO: 在此添加控件通知处理程序代码Comp(IDC_ADD);void CRegClientDlg:OnBnClickedSub()/ TODO: 在此添加控件通知

40、处理程序代码Comp(IDC_SUB);void CRegClientDlg:OnBnClickedMul()/ TODO: 在此添加控件通知处理程序代码Comp(IDC_MUL);void CRegClientDlg:OnBnClickedDiv()/ TODO: 在此添加控件通知处理程序代码Comp(IDC_DIV);void CRegClientDlg:OnBnClickedMod()/ TODO: 在此添加控件通知处理程序代码Comp(IDC_MOD);#define DllImport extern “C“ _declspec(dllimport)DllImport int Add(

41、int d1, int d2);DllImport int Sub(int d1, int d2);DllImport int Mul(int d1, int d2);DllImport double Div(int d1, int d2);DllImport int Mod(int d1, int d2);void CRegClientDlg:Comp(UINT nID)UpdateData();int r;double dr;switch(nID) case IDC_ADD: r = Add(m_iData1, m_iData2); break;case IDC_SUB: r = Sub(

42、m_iData1, m_iData2); break;case IDC_MUL: r = Mul(m_iData1, m_iData2); break;case IDC_MOD: r = Mod(m_iData1, m_iData2); break;case IDC_DIV: dr = Div(m_iData1, m_iData2); break;if (nID != IDC_DIV) SetDlgItemInt(IDC_RESULT, r);else wchar_t buf20;swprintf_s(buf, 20, L“%g“, dr);SetDlgItemText(IDC_RESULT, buf);5编译运行似上节的 ExtClient 项目,先设置 RegClient 项目为启动项目,再编译运行,结果如图8-14 所示:图 8-14 客户程序 RegClient 的运行结果作业1 实现 ExtDll 和 RegDll 例。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报