相关服务

  • 《应用科技》2006年第5期摘录:·38·应用科技第33卷DLL

如发现有乱码,请点击下面链接浏览原文
正文摘录:

·38·应用科技第33卷DLL映射到进程的地址空间中,此时可调用DLL中的函数和其他的资源,程序退出时,DLL自动释放,同一个DLL可以同时被多个应用动态的加载旧J.windows系统本身也有很多的DLL.DLL和静态连接库相比有以下的优点:1)多个进程可以调用同一个DLL,在同一个物理内存内共享同一份代码拷贝,节省大量的内存和硬盘资源,以减少系统交换.2)当DLL中的函数发生变化时,只要其函数名、变量类型、调用约定和返回值不变,调用DLL的应用程序就不需要重新编译和连接,当函数变化时,静态库却需要应用程序重新编译.3)只要遵循函数约定,用不同语言编写的应用程序可以使用相同的DLL中的函数.因为只是在执行时才得到真正的连接,使用动态连接库时,随同应用程序还要提供动态连接库文件(DLL文件).例如,发布Visualc++编写的程序时,如果使用了动态连接,则在提供可执行文件同时还需要提供VisualC++的动态连接库M].3动态连接库在VC中的实现原理3.1DLL的入口点函数对于每个DLL来说,都要有一个人口点,就像普通的函数有Main函数一样,进程装载或脱离DLL时系统都要调用入口点函数.当发生任何一种事件时,都会调用DLL的入口函数1)一个进程装载DLL时,对于使用装载时连接的进程,当进程初始化时,DLL开始装载,对于使用运行时连接的进程,DLL在I~oadI。,ibrary或LoadLi—braryEx函数返回之前调用.2)一个进程脱离DLL时,当进程终止或调用FreeI。ibrary函数使参考数变为O时,DLL开始卸载.如果是调用了TerminateProcess和TerminateThread函数而导致的进程终止,则系统不会调用DLL的人口点函数.3)装载了DLL的进程创建了另外的线程.4)装载了DLL的进程中的一个线程正常终止.DLL的人口点的DllMain函数结构如下:BOOLWINAPID11.MainfHINSTANCEhinstDLL.DWORDfdwReason.I~PVOID:lpReserved){switch(fswReason)caseDLLPROCESSATFACHcaseDLLJHREAD—A][rFACHcaseDLL—THREAD—DETA~:HcaseDLL—PROCESS—DE‘J'ACH}3.2DLL中导出函数的方法从DLL中导出函数一般有3种方法:1)使用【)EF、文件,它是一个包含描述DLL不同属性模块语句的文本文件,如果在程序中不使用一declspec(dllexport)关键字输出DLL函数,则必须有一个【)EF’文件.DEF文件中一般包含以下的语句:NAME:主输出程序或DLL文件名.LIBRARY:该语句指出DLL的内部名字,指示连接器生成DLL.DES(:RIPTI()N:描述DLL的用途,用单引号或双引号包含.STACKSIZE:以字节为单位设置堆栈的大小.SEC[’I()NS:设置段属性.EXPORTS:列出DLL导出函数名和其他信息.VERSI()N:给出DLL版本号.对于使用AppWizard创建的MFcDLL,App—wizard会创建一个:DEF。文件的框架,并自动增加到工程中,然后在DEF文件中添加用于输出的函数.如果是创建非MFCDLL,必须自己创建DEF文件,并添加到工程中.当建立DLL时,连接器会使用DEE、文件创建一个输出(.EXP)文件和一个输入库(.uB),然后,连接器会利用这些输出文件建立DLL文件,使用DI上的可执行程序可以显式的连接uB文件来使用DLL文件.2)使用一declspec(dllexport,)关键字.

阅读此文(图):   点击此处在线翻阅