动态链接库的创建
在Visual C++6.0开发环境下,打开File/New/Project选项,可以选择Win32 Dynamic-Link Library或MFC AppWizard[dll]来以不同的方式来创建Non-MFC Dll、Regular Dll、Extension Dll等不同种类的动态链接库。
1 用Win32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库
每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。
(1) 一个空的DLL工程
空的DLL工程,需要我们加入入口函数,加入头文件DllTest.h和资源文件DllTest.cpp。详细情况见条目(3)
(2)一个简单的DLL工程
它包含了一个入口函数,原型为:
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
工程文件中只有DllTest.cpp文件,我们要加入头文件DllTest.h。详情见条目(3)。
(3) 一个可以导出某些符号的DLL工程
它包含了一个入口函数,原型为:
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:
break;
}
return TRUE;
}
参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用、DLL_THREAD_ATTACH: 线程被调用、DLL_PROCESS_DETACH: 进程被停止、DLL_THREAD_DETACH: 线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。
我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。
1.1 使用导出函数关键字_declspec(dllexport)
示例中,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。
在DllTest.h中,代码如下:
//DllTest.h
extern "C" _declspec(dllexport) int Max(int a,int b);
extern "C" _declspec(dllexport) int Min(int a,int b);
在DllTest.cpp中,代码如下:
//DllTest.cpp
#include "DllTest.h"
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:
break;
}
return TRUE;
}
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;
}
该动态链接库编译成功后,打开DllTest工程中的debug目录,可以看到DllTest.dll、DllTest.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在DllTest.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。
1.2 用.def文件创建工程
不用头文件了,只要DllTest.cpp,另外再添加一个DllTest.def文件(代替了头文件)。代码如下:
LIBRARY DllTest
EXPORTS
Max
Min
动态链接库的创建
最新推荐文章于 2024-07-25 13:06:30 发布