入口函数,用 DllMain()函数就能使动态链接库在被调用时得到正确的初始化。如果应用程序
的 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() 函数,在 10。2。1 节中已经作了详细介绍,这里不再赘述。DLL 是包含若
·259 ·
…………………………………………………………Page 271……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
干个函数的库文件,应用程序使用 DLL 中的函数之前,应该先导出这些函数,以便供给应用
程 序 使 用 。 要 导 出 这 些 函 数 有 两 种 方 法 , 一 是 在 定 义 函 数 时 使 用 导 出 关 键 字
_declspec(dllexport) ,另外一种方法是在创建 DLL 文件时使用模块定义 DEF 文件。需要读者
注意的是在使用第一种方法的时候,不能使用 DEF 文件。下面通过两个例子来说明使用这两
种方法创建 DLL 文件的方法。
1.使用关键字_declspec(dllexport)
使用导出函数关键字_declspec(dllexport)创建 MyDll。dll,该动态链接库中有两个函数,分别
用来实现得到两个数的最大和最小值。在 MyDll。h 和 MyDLL。cpp 文件中分别输入如下原代码:
//MyDLL。h
extern 〃C〃 _declspec(dllexport) int Max(int a; int b);
extern 〃C〃 _declspec(dllexport) int Min(int a; int b);
//MyDll。cpp
#include
#include〃MyDll。h〃
int Max(int a; int b)
{
if(a》=b)
return a;
else
return b;
}
int Min(int a; int b)
{
if(a》=b)
return b;
else
return a;
}
该动态链接库编译成功后,打开“MyDll ”工程中的“debug ”目录,可以看到 MyDll。dll 、
MyDll。lib 两个文件。LIB 文件中包含 DLL 文件名和 DLL 文件中的函数名等,该文件只是对
应 DLL 文件的“映像文件 ”,比 DLL 文件中 LIB 文件的长度小,在进行隐式链接 DLL 时要
用到它。在 MyDll。h 中有关键字〃extern C〃,它可以使其他编程语言访问所编写的 DLL 中的
函数。
2 .用 DEF 文件创建工程
为了用 DEF 文件创建 DLL ,请先删除上个例子创建的工程中的 MyDll。h 文件,保留
MyDll。cpp 并在该文件中删除#include MyDll。h 语句,同时加入一个文本文件,命名为
MyDll。def ,再添加如下代码:
LIBRARY MyDll
·260 ·
…………………………………………………………Page 272……………………………………………………………
第 10 章 动态链接库
EXPORTS
Max
Min
其中 LIBRARY 语句说明该 DEF 文件属于相应的 DLL ,可以在 EXPORTS 语句下列出要
导出的函数名称。如果在 DEF 文件中的导出函数后加@n,如 Max@1 和 Min@2 ,表示要导
出的函数顺序号,在进行显式连时可以用到它。该 DLL 编译成功后,打开工程中的 Debug
目录,同样也会看到MyDll。dll 和 MyDll。lib 文件。
10。4。2 MFC AppWizard'dll'方式生成常规/扩展 DLL
在 MFC AppWizard'dll'下生成 DLL 文件有 3 种方式,在创建 DLL 时,要根据实际情况
选择创建 DLL 的方式。一种是常规 DLL 静态链接到 MFC ,另一种是常规 DLL 动态链接到
MFC 。前者使用的是 MFC 的静态链接库,生成的 DLL 文件长度大,一般不使用这种方式;
后者使用 MFC 的动态链接库,生成的 DLL 文件长度小。动态链接到 MFC 的规则 DLL 所有
输出的函数应该以如下语句开始:
AFX_MANAGE_STATE(AfxGetStaticModuleState()) //此语句用来正确地切换 MFC 模块状态
最后一种是 MFC 扩展 DLL ,这种 DLL 特点是用来建立 MFC 的派生类,DLL 只被用
MFC 类库所编写的应用程序所调用。前面已经介绍过,Extension DLLs 和 Regular DLLs 不
一样,它没有一个从 CWinApp 继承而来的类的对象,编译器默认了一个 DLL 入口函数
DLLMain()作为对 DLL 的初始化,可以在此函数中实现初始化,代码如下:
BOOL WINAPI APIENTRY DLLMain(HINSTANCE hinstDll ,DWORD reason ,LPVOID flmpload)
{
switch(reason)
{
……………//初始化代码;
}
return true;
}
参数 hinstDll 表示存放 DLL 的句柄,参数 reason 指明调用函数的原因 。对于隐式链接是
一个非零值,对于显式链接值是零。
在 MFC 下建立 DLL 文件,会自动生成 def 文件框架,其他与建立传统的 Non…MFC DLL
没有什么区别,只要在相应的头文件写入关键字_declspec(dllexport) 函数类型和函数名等,或
在生成的 def 文件中 EXPORTS 下输入函数名就可以了。需要注意的是在向其他开发人员分
发 MFC 扩展 DLL 时,不要忘记提供描述 DLL 中类的头文件以及相应的 LIB 文件和 DLL 本
身,此后开发人员就能充分利用开发的扩展 DLL 了。
10。4。3 导出函数调用约定
关于动态链接库输出函数的约定有调用约定和名字修饰约定两种。调用约定决定着函数
参数传送时入栈和出栈的顺序,以及编译器用来识别函数名字的修饰约定。名字修饰约定随
·261 ·
…………………………………………………………Page 273……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
调用约定和编译种类(C 或 C++ )的不同而变化。为了让不同的编程语言共享动态链接库带
来的方便,函数输出时必须使用正确的调用约定,并且最好不带有任何由编译器生成的名字
修饰。下面详细介绍实现这些需求的方法。
1.调用约定
Visual C++ 6。0 支持的函数调用约定有多种,在这里主要介绍_stdcall 调用约定、C 调用约
定和_fastcall 调用约定。
_stdcall 调用约定相当于 16 位动态库中经常使用的 PASCAL 调用约定。在 32 位的 Visual
C++
小说推荐
- 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章