动态和静态连接库

静态连接库文件 .libhtml

动态连接库文件 .dll程序员

 

连接库:连接库文件,是一种不可执行的二进制程序文件,它容许程序共享执行特殊任务所必需的代码和其余资源。编程

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------windows

连接库的编写:与源文件没有什么差异,只是少了一个main()入口函数,所以须要.exe文件调用(即不能本身运行)。(注:连接库的机器语言代码存储在.dll文件中,所以运行.exe文件时必须.dll文件可寻)编程语言

 优势(缘由):抄的哈哈函数

一、扩展了应用程序的特性;spa

二、能够用许多种编程语言来编写;debug

三、简化了软件项目的管理;htm

四、有助于节省内存进程

五、有助于资源共享

六、有助于应用程序的本地化;

七、有助于解决平台差别;

八、能够用于一些特殊的目的。windows使得某些特性只能为DLL所用。

顺便说明一下黑客用处:dll文件一旦运行是不单独显示进程,所以在dll文件中加载木马是几乎不可发现,嘿嘿嘿嘿(你懂的)。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

具体编写:

                                                         静态连接库

         建立.cpp文件和.h文件(由头文件的特性可知,头文件在任何程序中均可要可不要,只是标准而已(利于管理的目的))

         .h文件

         #ifndef LIB_H

        #define LIB_H

       extern "C"  int add(int,int);

       #endif

       .cpp文件

       #include "XXX.h"

       int add(int x,int y)

     {

            return x+y;

     }

    调用静态连接库

     建立.cpp文件

     #include " ........\\lib.h"

    #pragma comment(.....\\debug\\lib.lib)

   int main()

{

      ptintf("1+2=%d\n",add(2,1));

     return 0;

}

                                                          动态连接库

     建立dll文件

           建立.h文件

         #ifndef LIB_H

        #define LIB_H

       extern "C" int declspec(dllexport) int add(int,int);

       #endif

       建立.cpp文件      

       #include "XXX.h"

       int add(int x,int y)

     {

            return x+y;

     }

     函数导出方式1: int declspec(dllexport) int add(int,int);

    函数导出方式2:模块定义(.def)(须在dll工程中加.def文件)

 

    ;lib.def  导出dll函数     前面分号为注释至关于//

   LIBRARY  dll   ;dll文件名

   EXPORT          //导出函数

    add  @ 1        //函数名 +@+序号

 

 

    调用动态连接库

     方式一:动态调用方式(编程者用windows API加载和卸载dll文件)

     建立.cpp文件

     #include " ........\\lib.h"

    #include <windows.h>

   typedef int(*lpf)(int,int);

   int main()

{

      HINSTANCE hinstance;

      hinstance=LoadLibrary(",,,,,,\\debug\\ldll.dll");

     if(hinstance!=NULL)

    {

         lpf fun;

        fun=(lpf)GetAddress(hinstance,"add");

       if(fun!=NULL)

       {

                    printf("1+2=%d\n",fun(1+2));

        }else{

                  printf("函数不存在");

                  }

              FreeLibrary(hinstance);

    }else{   printf("动态连接库加载失败");   }

     return 0;

}

方式二(静态调用方式):(编译系统完成对dl的加载和应用程序结束时dll的卸载)

extern "C" __declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
{

int result = add(2,3);
printf ("%d",result);
return 0;
}

由上述代码能够看出,静态调用方式的顺利进行须要完成两个动做:


(1)告诉编译器与DLL 相对应的.lib 文件所在的路径及文件名,#pragma comment(lib,"dllTest.lib")


就是起这个做用。


程序员在创建一个DLL 文件时,链接器会自动为其生成一个对应的.lib 文件,该文件包含了DLL 导出


函数的符号名及序号(并不含有实际的代码)。在应用程序里, .lib 文件将做为DLL 的替代文件参与编译。


(2)声明导入函数, extern "C" __declspec(dllimport) add(int x,int y)语句中的


__declspec(dllimport) 发挥这个做用。

 

静态调用方式再也不须要使用系统API 来加载、卸载DLL 以及获取DLL 中导出函数的地址。这是由于,


当程序员经过静态连接方式编译生成应用程序时,应用程序中调用的与.lib 文件中导出符号相匹配的函数符


号将进入到生成的EXE 文件中,.lib 文件中所包含的与之对应的DLL 文件的文件名也被编译器存储在EXE


文件内部。当应用程序运行过程当中须要加载DLL 文件时,Window s 将根据这些信息发现并加载DLL ,而后


经过符号名实现对DLL 函数的动态连接。这样,EXE 将能直接经过函数名调用DLL 的输出函数,就象调用

程序内部的其余函数同样。

相关文章
相关标签/搜索