VC 动态链接库(DLL)编程深入浅出3
动态链接库(DLL)编程深入浅出(3)精品文档11页

第4节我们对非MFC DLL进行了介绍,这一节将详细地讲述MFC规则DLL的创建与使用技巧。
另外,自从本文开始连载后,收到了一些读者的e-mail。
有的读者提出了一些问题,笔者将在本文的最后一次连载中选取其中的典型问题进行解答。
由于时间的关系,对于读者朋友的来信,笔者暂时不能一一回复,还望海涵!由于笔者的水平有限,文中难免有错误和纰漏,也热诚欢迎读者朋友不吝指正!MFC规则DLL的概念体现在两方面:(1)它是MFC的“是MFC的”意味着可以在这种DLL的内部使用MFC;(2)它是规则的“是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是其与应用程序的接口不能是MFC。
而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的派生类。
Regular DLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。
在这种动态连接库中,包含一个从CWinApp继承下来的类,DllMain 函数则由MFC自动提供。
Regular DLL分为两类:(1)静态链接到MFC 的规则DLL静态链接到MFC的规则DLL与MFC库(包括MFC扩展DLL)静态链接,将MFC 库的代码直接生成在.dll文件中。
在调用这种DLL的接口时,MFC使用DLL的资源。
因此,在静态链接到MFC 的规则DLL中不需要进行模块状态的切换。
使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。
(2)动态链接到MFC 的规则DLL动态链接到MFC 的规则DLL 可以和使用它的可执行文件同时动态链接到MFC DLL 和任何MFC扩展DLL。
在使用了MFC共享库的时候,默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。
这样,当DLL和应用程序中存在相同ID的资源时(即所谓的资源重复问题),系统可能不能获得正确的资源。
因此,对于共享MFC DLL的规则DLL,我们必须进行模块切换以使得MFC能够找到正确的资源模板。
VC++动态链接库创建和调用全过程详解

1.概论先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
VC中使用动态链接库DLL

VC中使用动态链接库DLL:静态调用和动态调用2010-05-02 15:56VC中生成DLL的办法见:/KB/DLL/RegDLL.aspx--------------------------------------VC中使用DLL/c1230v/articles/1401448.html调用DLL有两种方法:静态调用和动态调用.(一).静态调用其步骤如下:1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。
然后在Object/library modules输入框中输入:youApp.lib6.选择你的目标工程Head Files加入:youApp.h文件;7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"注:youApp是你DLL的工程名。
(二).动态调用其程序如下:动态调用时只需做静态调用步骤1.01 {02 HINSTANCE hDllInst = LoadLibrary("youApp.DLL");03if(hDllInst)04 {05typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);06 MYFUNC youFuntionNameAlias = NULL;07// youFuntionNameAlias 函数别名08 youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName"); 09// youFuntionName 在DLL中声明的函数名10if(youFuntionNameAlias)11 {12 youFuntionNameAlias(param1,param2);13 }14 FreeLibrary(hDllInst);15 }16 }显式(静态)调用:LIB + DLL + .H,注意.H中dllexport改为dllimport隐式(动态)调用:DLL + 函数原型声明,先LoadLibrary,再GetProcAddress(即找到DLL中函数的地址),不用后FreeLibrary--------------------------------------动态链接库DLL的链接/mmycly/archive/2006/06/15/917076.aspx应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。
使用vs建立动态链接库dll过程和使用方法

使用vs建立动态链接库dll的过程和使用方法创建动态链接库(DLL)的过程可以分为几个步骤。
我将使用Visual Studio 来演示这个过程:创建DLL的步骤:1.打开Visual Studio,选择“文件”->“新建”->“项目”。
2.在新项目窗口中,选择“Visual C++”->“Windows桌面向导应用程序”。
3.输入项目名称和位置,然后点击“确定”。
4.在“解决方案资源管理器”中,右键单击项目名称->添加->新建项。
5.在“添加新项”窗口中,选择“DLL”,输入DLL名称,然后点击“添加”。
编写DLL代码:现在你已经有了一个空的DLL,你可以开始编写你的代码了。
例如,你可以添加以下代码到你的.cpp文件中:在这个例子中,我们创建了一个简单的函数add,它接收两个整数并返回它们的和。
extern "C"部分告诉编译器使用C链接规则创建导出函数,__declspec(dllexport)部分使得该函数可以从DLL中导出。
编译和生成DLL:在Visual Studio中,你可以通过点击“生成”菜单然后选择“生成解决方案”来编译和生成你的DLL。
如果编译成功,你可以在你的项目文件夹的Debug或Release 文件夹中找到生成的DLL文件。
使用DLL:使用DLL的过程可以分为几个步骤:1.加载DLL:使用Windows API函数LoadLibrary可以加载DLL。
例如:HMODULE hMod = LoadLibrary(TEXT("MyDLL.dll"));。
这个函数会返回一个模块句柄,如果DLL加载成功的话。
2.获取函数地址:使用GetProcAddress函数可以获取DLL中函数的地址。
例如:add_proc = (int (*)(int, int))GetProcAddress(hMod, "add");。
VC++动态链接库编程

VC++动态链接库编程2005-10-02 09:49作者:宋宝华出处:作者授权转载/lesson/318/2166818.shtml摘要 (2)第一章基础概念 (2)1.1 概论 (2)1.2 静态链接库 (3)1.3 库的调试与查看 (5)第二章非MFC DLL (7)2.1 一个简单的DLL (7)2.2 声明导出函数 (9)2.3 DLL的调用方式 (10)2.4 DllMain函数 (11)2.5 _stdcall约定 (13)2.6 DLL导出变量 (14)2.7 DLL导出类 (16)第三章MFC规则DLL (20)3.1概述 (20)3.2 MFC规则DLL的创建 (21)3.3 一个简单的MFC规则DLL (23)3.4 MFC规则DLL的调用 (27)3.5 共享MFC DLL的规则DLL的模块切换 (28)第四章MFC扩展DLL (33)4.1 概论 (34)4.2 MFC扩展DLL导出MFC派生类 (35)4.3 MFC扩展DLL的加载 (37)4.3.1 隐式加载 (37)4.3.2 显示加载 (38)4.4 MFC扩展DLL加载MFC扩展DLL (39)4.5 MFC扩展DLL导出函数和变量 (40)4.6 MFC扩展DLL的应用 (41)第五章典型实例 (45)5.1 算法DLL (45)5.2纯资源DLL (48)5.3通信控制DLL (50)5.4 DLL木马 (53)5.4.1 DLL木马的原理 (53)5.4.2 DLL木马注入程序 (53)5.4.3 DLL木马的防治 (57)第六章读者反馈与答复 (57)6.1 关于文章的获取 (57)6.2 关于DLL的疑问 (58)6.2.1 (58)6.2.2 (59)6.2.3 (61)6.2.4 (62)6.2.5 (62)结语 (63)摘要动态链接库(DLL)是Windows系统的核心,也是COM技术的基础,因此突破动态链接库一直是技术人员的攻坚目标,本期专题将由浅入深的介绍动态链接库的基础慨念、分类、实现和应用。
VC动态链接库

VC动态链接库(2008-09-27 17:09:41)转载标签:vcdll 分类:技术笔记动态链接库(DLL) 是作为共享函数库的可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个DLL 中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个DLL 副本的内容。
可见,动态链接库的主要作用就是共享函数库。
操作系统提供这样一种机制,保证函数库在系统中只有一份实例。
至于DLL中的全局变量,对于每一个进程调用,操作系统会复制一份副本,以避免不同进程之间的干扰。
理论上讲,因为DLL的目的主要在于共享函数库,所提供的函数应尽量具有中立性,不应与应用细节关联太紧密。
因为副本的增加要多占用系统资源与处理负担,所以,应该尽量避免在DLL中使用过多的全局变量,尤其是具有大量数据成员和成员函数的C++全局类对象。
DLL是为面向模块和代码复用而设计,但它却时常被用来作软件之间的分层设计。
用作分层设计目标的DLL,多进程复用没有太多的意义。
实际应用当中也有一种情况,如果一个DLL操控制某个设备在系统中具有唯一性,我们必须要求该DLL考虑不能用于多个进程实例的特性。
然而仅凭操作系统的一些基础性支持,就能做到实例唯一吗?非也,编程者要仔细理解DLL原理与机制,并作大量的练习处理后,才能做到真正的系统实例唯一。
方法之一:在DLL中定义全局变量DLL定义的全局变量可以被调用进程访问;DLL可以访问调用进程的全局数据。
我们可以这样设想,在DLL中定义一标志全局变量,每当进程调用之前,先检查此变量就可以得知是不是已有进程在调用DLL。
然而,DLL中的全局变量会随新进程的应用而拷贝副本。
你在A进程中看到的全局变量Flag_XX与你在B进程中看到的Flag_XX其实不是同一样标记。
所以简单的定义全局变量作进程标记,是不能实现进程应用唯一性的判断。
VC++动态链接库(DLL)编程深入浅出(全)

3.库的调试与查看
在具体进入各类 DLL 的详细阐述之前,有必要对库文件的调试与查看方法 进行一下介绍,因为从下一节开始我们将面对大量的例子工程。
由于库文件不能单独执行,因而在按下 F5(开始 debug 模式执行)或 CTRL+F5(运行)执行时,其弹出如图 3 所示的对话框,要求用户输入可执行文 件的路径来启动库函数的执行。这个时候我们输入要调用该库的 EXE 文件的路径 就可以对库进行调试了,其调试技巧与一般应用工程的调试一样。
图 3 库的调试与“运行” 通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库 的工程)放置在同一 VC 工作区,只对应用工程进行调试,在应用工程调用库中 函数的语句处设置断点,执行后按下 F11,这样就单步进入了库中的函数。第 2 节中的 libTest 和 libCall 工程就放在了同一工作区,其工程结构如图 4 所示。
一般的程序员都用过类似 MessageBox 的函数,其实它就包含在 user32.dll 这个动态链接库中。由此可见 DLL 对我们来说其实并不陌生。
(3)VC 动态链接库的分类 Visual C++支持三种 DLL,它们分别是 Non-MFC DLL(非 MFC 动态库)、MFC Regular DLL(MFC 规则 DLL)、MFC Extension DLL(MFC 扩展 DLL)。
如图 6,在 VC++中 new 一个 Win32 Dynamic-Link Library 工程 dllTest (单击此处下载本工程附件)。注意不要选择 MFC AppWizard(dll),因为用 MFC AppWizard(dll)建立的将是第 5、6 节要讲述的 MFC 动态链接库。
动态链接库(DLL)编程深入浅出(3)

您正在看的VC教程是:关于VC中的DLL的编程。
在我们实际用软件时,经常可看到许多动态连接库。
动态连接库有其自身的优点如节省内存、支持多语种等功能,而且,当DLL中的函数改变后,只要不是参数的改变调用起的函数并不需要重新编译。
这在编程时十分有用。
至于其他妙处,各位在电脑杂志、书籍中都能看到,我这里再说就是废话了.这次小弟我所要讲的是如何在VC5.0中如何做自己的Win32 DLLs,各位要做自己的动态连接库,首先要知道DLL在VC5.0中都有哪几种分类。
VC支持三种DLL,它们是:1.Non-MFC Dlls2.Regular Dlls3.Extension Dlls Note:翻译措辞不当,故遇到术语是引用原词Non-MFC DLL:指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。
LL,Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的。
明显的特点是在源文件里有一个继承CWinApp的类。
其又可细分成静态连接到MFC和动态连接到MFC 上的。
但静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。
Extension DLL:用来实现从MFC所继承下来的类的重新利用,也就是说,用这种类型的动态连接库,可以用来输出一个从MFC所继承下来的类。
Extension DLL使用MFC 的动态连接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。
各位看到这里如果眼有点花或头有点晕,请别泄气,再看两遍,然后继续往下看,定有收获。
标题: 关于VC中的DLL的编程[1]这一节介绍Non-MFC DLLs的编写方法。
下面是一个通用的写法:BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch( ul_reason_for_call ) {case DLL_PROCESS_ATTACH:.......case DLL_THREAD_ATTACH:.......case DLL_THREAD_DETACH:.......case DLL_PROCESS_DETACH:.......}return TRUE;}每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4节我们对非MFC DLL进行了介绍,这一节将详细地讲述MFC规则DLL的创建与使用技巧。
另外,自从本文开始连载后,收到了一些读者的e-mail。
有的读者提出了一些问题,笔者将在本文的最后一次连载中选取其中的典型问题进行解答。
由于时间的关系,对于读者朋友的来信,笔者暂时不能一一回复,还望海涵!由于笔者的水平有限,文中难免有错误和纰漏,也热诚欢迎读者朋友不吝指正!5. MFC规则DLL5.1 概述MFC规则DLL的概念体现在两方面:(1)它是MFC的“是MFC的”意味着可以在这种DLL的内部使用MFC;(2)它是规则的“是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是其与应用程序的接口不能是MFC。
而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的派生类。
Regular DLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。
在这种动态连接库中,包含一个从CWinApp继承下来的类,DllMain函数则由MFC自动提供。
Regular DLL分为两类:(1)静态链接到MFC 的规则DLL静态链接到MFC的规则DLL与MFC库(包括MFC扩展DLL)静态链接,将MFC库的代码直接生成在.dll文件中。
在调用这种DLL的接口时,MFC使用DLL的资源。
因此,在静态链接到MFC 的规则DLL中不需要进行模块状态的切换。
使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。
(2)动态链接到MFC 的规则DLL动态链接到MFC 的规则DLL 可以和使用它的可执行文件同时动态链接到MFC DLL 和任何MFC扩展DLL。
在使用了MFC共享库的时候,默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。
这样,当DLL和应用程序中存在相同ID的资源时(即所谓的资源重复问题),系统可能不能获得正确的资源。
因此,对于共享MFC DLL的规则DLL,我们必须进行模块切换以使得MFC能够找到正确的资源模板。
我们可以在Visual C++中设置MFC规则DLL是静态链接到MFC DLL还是动态链接到MFC DLL。
如图8,依次选择Visual C++的project -> Settings -> General菜单或选项,在Microsoft Foundation Classes中进行设置。
图8 设置动态/静态链接MFC DLL5.2 MFC规则DLL的创建我们来一步步讲述使用MFC向导创建MFC规则DLL的过程,首先新建一个project,如图9,选择project的类型为MFC AppWizard(dll)。
点击OK进入如图10所示的对话框。
图9 MFC DLL工程的创建图10所示对话框中的1区选择MFC DLL的类别。
2区选择是否支持automation(自动化)技术,automation 允许用户在一个应用程序中操纵另外一个应用程序或组件。
例如,我们可以在应用程序中利用Microsoft Word 或Microsoft Excel的工具,而这种使用对用户而言是透明的。
自动化技术可以大大简化和加快应用程序的开发。
3区选择是否支持Windows Sockets,当选择此项目时,应用程序能在TCP/IP 网络上进行通信。
CWinApp派生类的InitInstance成员函数会初始化通讯端的支持,同时工程中的StdAfx.h文件会自动include <AfxSock.h>头文件。
添加socket通讯支持后的InitInstance成员函数如下:BOOL CRegularDllSocketApp::InitInstance(){if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}return TRUE;}4区选择是否由MFC向导自动在源代码中添加注释,一般我们选择“Yes,please”。
图10 MFC DLL的创建选项5.3 一个简单的MFC规则DLL这个DLL的例子(属于静态链接到MFC 的规则DLL)中提供了一个如图11所示的对话框。
图11 MFC规则DLL例子在DLL中添加对话框的方式与在MFC应用程序中是一样的。
在图11所示DLL中的对话框的Hello按钮上点击时将MessageBox一个“Hello,pconline 的网友”对话框,下面是相关的文件及源代码,其中删除了MFC向导自动生成的绝大多数注释(下载本工程附件):第一组文件:CWinApp继承类的声明与实现// RegularDll.h : main header file for the REGULARDLL DLL#if !defined(AFX_REGULARDLL_H__3E9CB22B_588B_4388_B778_B3416ADB79B 3__INCLUDED_)#defineAFX_REGULARDLL_H__3E9CB22B_588B_4388_B778_B3416ADB79B3__INCLUDE D_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#ifndef __AFXWIN_H__#error include 'stdafx.h' before including this file for PCH#endif#include "resource.h" // main symbolsclass CRegularDllApp : public CWinApp{public:CRegularDllApp();DECLARE_MESSAGE_MAP()};#endif// RegularDll.cpp : Defines the initialization routines for the DLL.#include "stdafx.h"#include "RegularDll.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifBEGIN_MESSAGE_MAP(CRegularDllApp, CWinApp)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CRegularDllApp constructionCRegularDllApp::CRegularDllApp(){}/////////////////////////////////////////////////////////////////////////////// The one and only CRegularDllApp objectCRegularDllApp theApp;分析:在这一组文件中定义了一个继承自CWinApp的类CRegularDllApp,并同时定义了其的一个实例theApp。
乍一看,您会以为它是一个MFC应用程序,因为MFC应用程序也包含这样的在工程名后添加“App”组成类名的类(并继承自CWinApp类),也定义了这个类的一个全局实例theApp。
我们知道,在MFC应用程序中CWinApp取代了SDK程序中WinMain的地位,SDK程序WinMain所完成的工作由CWinApp的三个函数完成:virtual BOOL InitApplication( );virtual BOOL InitInstance( );virtual BOOL Run( ); //传说中MFC程序的“活水源头”但是MFC规则DLL并不是MFC应用程序,它所继承自CWinApp的类不包含消息循环。
这是因为,MFC规则DLL不包含CWinApp::Run 机制,主消息泵仍然由应用程序拥有。
如果DLL 生成无模式对话框或有自己的主框架窗口,则应用程序的主消息泵必须调用从DLL 导出的函数来调用PreTranslateMessage成员函数。
另外,MFC规则DLL与MFC 应用程序中一样,需要将所有DLL中元素的初始化放到InitInstance 成员函数中。
第二组文件自定义对话框类声明及实现(点击查看附件)分析:这一部分的编程与一般的应用程序根本没有什么不同,我们照样可以利用MFC类向导来自动为对话框上的控件添加事件。
MFC类向导照样会生成类似ON_BN_CLICKED(IDC_HELLO_BUTTON, OnHelloButton)的消息映射宏。
第三组文件DLL中的资源文件//{{NO_DEPENDENCIES}}// Microsoft Developer Studio generated include file.// Used by RegularDll.rc//#define IDD_DLL_DIALOG 1000#define IDC_HELLO_BUTTON 1000分析:在MFC规则DLL中使用资源也与在MFC应用程序中使用资源没有什么不同,我们照样可以用Visual C++的资源编辑工具进行资源的添加、删除和属性的更改。
第四组文件MFC规则DLL接口函数#include "StdAfx.h"#include "DllDialog.h"extern "C" __declspec(dllexport) void ShowDlg(void){CDllDialog dllDialog;dllDialog.DoModal();}分析:这个接口并不使用MFC,但是在其中却可以调用MFC扩展类CdllDialog的函数,这体现了“规则”的概类。
与非MFC DLL完全相同,我们可以使用__declspec(dllexport)声明或在.def中引出的方式导出MFC规则DLL中的接口。
5.4 MFC规则DLL的调用笔者编写了如图12的对话框MFC程序(下载本工程附件)来调用5.3节的MFC规则DLL,在这个程序的对话框上点击“调用DLL”按钮时弹出5.3节MFC规则DLL中的对话框。
图12 MFC规则DLL的调用例子下面是“调用DLL”按钮单击事件的消息处理函数:void CRegularDllCallDlg::OnCalldllButton(){typedef void (*lpFun)(void);HINSTANCE hDll; //DLL句柄hDll = LoadLibrary("RegularDll.dll");if (NULL==hDll){MessageBox("DLL加载失败");}lpFun addFun; //函数指针lpFun pShowDlg = (lpFun)GetProcAddress(hDll,"ShowDlg");if (NULL==pShowDlg){MessageBox("DLL中函数寻找失败");}pShowDlg();}上述例子中给出的是显示调用的方式,可以看出,其调用方式与第4节中非MFC DLL的调用方式没有什么不同。