用 AppWizard 生成应用程序时,可以指定资源文件使用的语言,这就是通过提供不同
的动态链接库实现的。
一般来说,DLL 是一种磁盘文件(通常带有 DLL 扩展名),它由全局数据、服务函数和
资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其他
DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL 模块中包含各种导
出函数,用于向外界提供服务。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的
导出函数相匹配。
在 Win32 环境中,每个进程都复制了自己的读写全局变量 。如果想要与其他进程共享内
存,必须使用内存映射文件或者声明一个共享数据段。DLL 模块需要的堆栈内存都是从运行
进程的堆栈中分配出来的。DLL 现在越来越容易编写。Win32 已经大大简化了其编程模式,
并有许多来自 AppWizard 和 MFC 类库的支持。使用 Visual C++ 6。0 工具可以编写 3 种不同类
型的动态链接库。
o Non…MFC DLL :指的是不用 MFC 的类库结构,直接用 C 语言编写的 DLL ,其输出的
函数一般用的是标准 C 接口,并能被非 MFC 或 MFC 编写的应用程序所调用。
o Regular DLL :和下述的 Extension Dlls 一样,是用 MFC 类库编写的。其特点是在源文
件里有一个继承 CWinApp 的类。其又可细分成静态连接到 MFC 和动态连接到 MFC
上的。但静态连接到 MFC 的动态链接库只被 Visual C++ 的专业版和企业版所支持。
o Extension DLL :用来实现从 MFC 所继承下来的类的重新利用,也就是说,用这种类
型的动态链接库,可以用来输出一个从 MFC 所继承下来的类。Extension DLL 使用
MFC 的动态连接版本所创建的,并且它只被用 MFC 类库所编写的应用程序所调用。
10。2 DLL 的出入口函数
DllMain() 函数是 DLL 模块的默认入口点。当 Windows 加载 DLL 模块时调用这一函数。
系统首先调用全局对象的构造函数,然后调用全局函数 DllMain() 。DllMain() 函数不仅在将
DLL 链接加载到进程时被调用,在 DLL 模块与进程分离时(以及其他时候)也被调用。
DLL 文件中包含一个导出函数表 。这些导出函数由它们的符号名和称为标识号的整数与
外界联系起来。函数表中还包含了 DLL 中函数的地址。当应用程序加载 DLL 模块时,它并
不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载 DLL
模块时动态建立一个函数调用与函数地址的对应表 。如果重新编译和重建 DLL 文件,并不需
要修改应用程序,除非改变了导出函数的符号名和参数序列。
简单的 DLL 文件只为应用程序提供导出函数,比较复杂的 DLL 文件除了提供导出函数
·252 ·
…………………………………………………………Page 264……………………………………………………………
第 10 章 动态链接库
以外,还调用其他 DLL 文件中的函数。这样,一个特殊的 DLL 既有导入函数,又有导出函
数。这并不是一个问题,因为动态链接过程可以处理交叉相关的情况。
在 DLL 代码中,声明导出函数的代码如下:
__declspec(dllexport) int MyFunction(int n);
但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。在
应用程序方面,声明相应的输入函数,代码如下:
__declspec(dllimport) int MyFuncition(int n);
仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的 DLL 文件上。应用
程序的项目必须为链接程序指定所需的输入库(LIB 文件)。而且应用程序事实上必须至少包
含一个对 DLL 函数的调用。本节将对 DLL 的 DllMain()入口函数和导出函数作相关的介绍。
10。2。1 DllMain()函数
每一个 DLL 必须有一个入口点,这就象用 C 编写的应用程序一样,必须有一个 WinMain
函数一样。在 Non…MFC DLL 中 DllMain()是一个默认的入口函数,不需要编写自己的 DLL
入口函数,用这个默认的入口函数就能使动态链接库在被调用时初始化。如果应用程序的
DLL 需要分配额外的内存或资源,即对每个进程或线程初始化和清除操作时,就需要在相应
的 DLL 工程的 CPP 文件中对 DllMain() 函数按照下面的格式书写,代码如下:
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;
}
注意:函数名 DllMain 是区分大小写的。许多编程人员有时调用的函数是 DLLMain 。这是一个非
常容易犯的错误,因为 DLL 这个词常常使用大写来表示。如果调用的进入点函数不是
DllMain ,而是别的函数,代码将能够编译和链接,但是其进入点函数永远不会被调用,
DLL 永远不会被初始化。
参数 hinstDll 包含了 DLL 的实例句柄。与(w)WinMain 函数的 hinstExe 参数一样,这个
值用于标识 DLL 的文件映像被映射到进程的地址空间中的虚拟内存地址。通常将这个参数保
·253 ·
…………………………………………………………Page 265……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
存在一个全局变量中,这样就可以在调用加载资源函数(如 DialogBox 和 LoadString )时使
用它。最后一个参数是 fImpLoad,如果 DLL 是隐含加载的,那么该参数将是个非 0 值,如
果 DLL 是显式加载的,那么它的值是 0 。
参 数 fdwReason 用 于 指 明 系 统 为 什 么 调 用 该 函 数 。 该 参 数 可 以 使 用
DLL_PROCESS_ATTACH ( 进 程 被 调 用 )、DLL_THREAD_ATTACH ( 线 程 被 调 用 )、
DLL_PROCESS_DETACH (进程被停止)、DLL_THREAD_DETACH (线程被停止)4 个值的
其中之一,lpReserved 为保留参数。下面就具体介绍这 4 个值的意义。
1.DLL_PROCESS_ATTACH 通知
当 DLL 被初次映射到进程的地址空间中时,系统将调用该 DLL 的 DllMain() 函数,给它
传递参数 fdwReason 的值 DLL_PROCESS_ATTACH 。只有当 DLL 的文件映像初次被映射时,
才 会 出现 这种 情 况。 如果 线 程在 后来 为 已经 映射 到 进程 的地 址 空间 中的 DLL 调用
LoadLibrary(Ex) 函 数 , 那 么 操 作 系 统 只 是 递 增 DLL 的 使 用 计 数 , 它 不 会 再 次 用
DLL_PROCESS_ATTACH 的值来调用 DLL 的 DllMain() 函数。
当处理 DLL_PROCESS_ATTACH 时,DLL 应该执行 DLL 中的函数要求的任何与进程相
关的初始化。例如,DLL 可能包含需要使用它们自己的堆栈(在进程的地址空间中创建 )的
函数。通过在处理DLL_PROCESS_ATTACH 通知时调用 HeapCreate() 函
小说推荐
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章
- VB2008从入门到精通(PDF格式英文版)
- -Page 1(R)The eXperT’s Voice inBeginningVB 2008From Novice to ProfessionalChristian Gross-Page 2-Page 3-Beginning VB 2008From Novice to Professional■C
- 最新章:第214章
- C语言设计
- 作者:谭浩强1 C 语言概述1.1 C语言的发展过程1.2 当代最优秀的程序设计语言1.3 C语言版本1.4 C语言的特点1.5 面向对象的程序设计语言1.6 C和C+1.7 简单的C程序介绍1.8 输入和输出函数1.9 C源程序的结构特点1.10书写程序时应遵循的规则1.11C语言的字符集1.12
- 最新章:第45章
- 设计成婚:不入豪门
- 作者:海未央《设计成婚2:名门新娘》作品介绍《名门新娘》介绍:她是骆家收养的孤女,性格因为受他的影响,变得有些古灵精怪,也懂得是非之分!他说他的一切只为他而努力,可是为什么要拒绝自己呢?什么?没有满十八岁?那今天生日,够十八岁了吧?什么,还太小?太过分了,这不是耍着自己玩吗?嘿嘿,有个邪恶的老师,那
- 最新章:第196章
- 玄学,从入门到放弃
- 《玄学,从入门到放弃》作者:李传言文案:周诣一手拿着卜卦,一手拿着《演员的自我修养,叹息良久。他本是百年前观天占星的玄术师,谁知却一朝重生现代。他只想平淡地生活下去,可天不遂人愿,他注定将在这末法时代掀起波澜!成就一代影帝!谢千仇沉默地看着他…大师,你卦和书都拿倒了#玄学,从入门到放弃,入土,删库跑
- 最新章:第86章
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 最新章:第143章
- 要你言听计从
- 作者:决明第一章哈士奇,没有护卫看家的本领,对主人、客人甚至是闯空门的恶人都一样友善,咬着皮球跟小偷一块玩你丢我捡也不用太惊讶,时常被人认为忠诚度不足。贺世祺背靠在冰冷玻璃落地窗前,一整间屋子都是伸手不见五指的黑暗,也好,反正他现在什么也不需要看到,只要耳朵还有听觉就好,顺便听听贴在耳边的手机里还要
- 最新章:第28章