動態和靜態連接庫

靜態連接庫文件 .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 的輸出函數,就象調用

程序內部的其餘函數同樣。

相關文章
相關標籤/搜索