介绍了DLL的开发方法
源代码在线查看: 动态连接库的开发与使用.txt
一、动态链接库的介绍
动态链接库(DLL)是一个包含了若干个到处函数的可执行模块,它其实是一个函数包。动态链接库实现了代码和其它资源的共享,具有模块封装特性。
使用VC6.0的AppWizard创建DLL,DLL的类型有三个选项:
1、静态链接库;
2、Win32应用程序和MFC应用程序都能调用的动态链接库;
3、只有MFC应用程序才能调用的动态链接库。
一般的开发选用第二项,但是具体的选择要看具体的应用。
二、动态链接库的实现
各种不同的书籍介绍动态链接库的实现方法都是略有差异的,在这里我做了个归纳。觉得动态链接库的实现是根据后面介绍的、动态链接库的链接方式(隐式链接、显式链接)的不同而不同。所以,我们分两种方式来讲。
1、隐式链接方法对应的动态链接库的实现
a、通过AppWizard[DLL]建立dll;
b、在实现文件.cpp中编写自定义的函数myFun
_declspec(dllexport) char * WINAPI myFun()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//自己的实现过程
……
}
c、在.h文件里面添加对myFun的声明:
_declspec(dllexport) char * WINAPI myFun();
d、编译、链接就生成了动态链接库myFun.dll和关联库myFun.lib
2、显式链接方法对应的动态链接库的实现
a、通过AppWizard[DLL]建立dll;
b、在实现文件.cpp中编写自定义的函数myFun
_declspec(dllexport) char * WINAPI myFun()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//自己的实现过程
……
}
c、在.h文件里面添加对myFun的声明:
_declspec(dllexport) char * WINAPI myFun();
d、在.def文件下设置EXPORTS先添加导出函数myFun:
EXPORTS
myFun
e、编译、链接就生成了动态链接库myFun.dll
三、动态链接库的使用
1、隐式链接
采用这种方式的时候,应用程序需要使用原动态链接库的导入文件(LIB文件)。
a、新建测试程序;
b、添加消息响应,直接使用dll里面的函数;
c、在消息响应的那个文件的.h文件里面对myFun函数声明为外部定义(extern)函数,以便正确的编译和链接:
extern char * WINAPI myFun();
d、将dll和lib文件拷贝到测试程序目录。
e、在测试程序中指定lib路径:
通过Project/Settings指定lib路径。
f、编译、运行测试程序。
2、显式链接
区别于隐式链接,采用显式链接方式,应用程序不需要动态链接库的导入文件(LIB文件)。动态链接库中的到处函数必须在模块定义文件(DEF文件)中进行EXPORTS说明。
a、新建测试程序;
b、添加消息响应函数:
{
typedef char * (*GETDT)();//声明一个指向函数的指针类型
GETDT GetDT;//声明一个指向函数的指针变量
FARPROC lpfn=NULL;
HINSTANCE hinst=NULL;
hinst=LoadIibrary("myFun.dll");
if(hinst==NULL)
{
MessageBox("Can not load dll");
return;
}
lpfn=GetProcAddress(hinst,"myFun");//获得函数myFun()的地址
if(lpfn==NULL)
{
MessageBox("Can not load function");
return;
}
else
{
GetDT=(GETDT)lpfn;
……
FreeLibrary(hinst);//卸载DLL
}
c、编译、运行。
}