文档详情

动态链接库(DLL)编程.ppt

发布:2025-04-04约8.07千字共10页下载文档
文本预览下载声明

(.def)文件声明为DLL创建一个.DEF文件(模块定义文件),并在build该DLL时使用这个.DEF文件。使用这种方法使你可以将函数按序号export。在LINK选项卡中假如:/def:lib.def将lib.def加入到工程中。lib.def;lib.def:导出DLL函数

LIBRARYdllTest

EXPORTS

add@1.def文件的规则为:

LIBRARY语句说明.def文件相应的DLL;

EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);

def文件中的注释由每个注释行开始处的分号(;)指定,且注释不能与语句共享一行。库的调试与查看动态链接库中的导出接口可以使用VisualC++的Depends工具进行查看,用Depends打开系统目录中的MouseHook.dll.PARTONEDLL的调用方式隐式调用:将DLL工程生成的.lib文件和.dll文件拷入当前工程所在的目录,并在*.cpp文件(的顶部添加:#pragmacomment(lib,RegularDll.lib)OR动态调用特点:是完全由编程者用API函数加载和卸载DLL,程序员可以决定DLL文件何时加载或不加载,显式链接在运行时决定加载哪个DLL文件。第一章dllTest.dll在建立的工程中添加lib.h及lib.cpp文件,源代码如下:/*文件名:lib.h*/#ifndefLIB_H#defineLIB_HexternCint__declspec(dllexport)add(intx,inty);#endif/*文件名:lib.cpp*/#includelib.hintadd(intx,inty){returnx+y;}调用dllTest.dll#includestdio.h#includewindows.htypedefint(*lpAddFun)(int,int);//宏定义函数指针类型intmain(intargc,char*argv[]){

HINSTANCEhDll;//DLL句柄

lpAddFunaddFun;//函数指针

hDll=LoadLibrary(..\\Debug\\dllTest.dll);

if(hDll!=NULL){

addFun=(lpAddFun)GetProcAddress(hDll,add);

if(addFun!=NULL)

{

intresult=addFun(2,3);

printf(%d,result);

}

FreeLibrary(hDll);

}

DLL的Export和ImportDLL的export是指将DLL中的函数和数据输出到其它程式中,以供其使用。DLL的import是指使用DLL的程式引入DLL中的函数和数据。DLL的exportDLL中包含有一个表,称为exporttable(以下简称ET),其中包含了DLL中可以被外部程式使用的所有函数和数据的名字。只有记录在ET中的函数和数据才可以被外部程式所使用(如果没有.DEF文件的话),其它所有没有记录在ET中的函数和数据都被视为是DLL私有的。DllMain函数Windows在加载DLL的时候,需要一个入口函数,就如同控制台或DOS程序需要main函数、WIN32程序需要WinMain函数一样。在前面的例子中,DLL并没有提供DllMain函数,应用工程也能成功引用DLL,这是因为Windows在找不到DllMain的时候,系统会从其它运行库中引入一个不做任何操作的缺省DllMain函数版本,并不意味着DLL可以放弃DllMain函数。BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved)DllMain函数在DLL被加载和卸载时被调用,在单个线程启动和终止时,DLLMain函数也被调用;ul_reason_for_call指明了被调用的原因。原因共有4种,即PROCESS_ATTACH、PROCESS_DETACH、THREAD_ATTACH和THREAD_DETACH,以switch语句列出。DLL导出变量/*文件名:lib.h*/

#ifndefLIB_H

#defineLIB_H

exter

显示全部
相似文档