動態鏈接庫編程范例


我們經常在做各種二次開發的時候都會使用賣方提供的SDK進行開發,往往賣方並不願理提供給我源程序而是給我一個提供

一系列函數接口說明和一些封裝的動態鏈接庫。

 

今天我們就要說說靜態鏈接庫和動態鏈接庫,靜態鏈接庫往往以lib后綴結尾,然而動態鏈接庫往往以dll后綴結束。是我

們不能僅僅以后綴名作為它們二者的區別,比如動態鏈接庫也可能存在lib后綴的文件,然而這種情況下lib文件是保存一

些函數符號,正則的提供運行代碼的指令部分仍然存在在dll文件中。

 

其實從本質上來說,動態鏈接庫是我們再運行程序的時候在進行鏈接,然而靜態鏈接庫的代碼指令是直接包含在最終的應用

序中,所以我們有使用的動態鏈接庫在生成最終的程序里,如果一旦將該動態鏈接庫文件刪除,程序將提示確實xxx.dll文件。

然而使用靜態鏈接庫生成的最終程序里,我們直接刪除靜態鏈接庫文件,程序仍然將正常執行。因為在生成程序的過程中,靜

態鏈接庫中的代碼指令已經完全的嵌入到了應用程序中了。windows提供的大多數服務都是以dll形式提供的。然而靜態鏈接庫

然可移植性強,但是會造成程序很龐大,所以往往大多數開發接口都是以動態鏈接庫的形式提供的。

 

下面將展示一個簡單的動態鏈接庫的范例:
1.打開vc++6.0新建一個動態鏈接庫工程,取名為Dlldemo:

 

 

2.創建一個空的DLL工程:

 

 

3.我們添加一個頭文件為AddDll.h 一個源文件為AddDll.cpp在本范例中我們將要把下面這個函數封裝為動態鏈接

庫提供給第三方開發:

int Add(int a,int b)
{
    return a+b;
}

 

4.我們在頭文件里添加需要導出的函數的聲明:

1 extern "C" _declspec(dllexport) int Add(int a,int b);

 

 

5.然后在源文件里面實現這個導出函數:

1 #include "AddDll.h"
2 
3 int Add(int a,int b)
4 {
5     return a+b;
6 }

 

6.編譯工程,此時便在工程目錄下生成了我們需要的dll文件,如下圖所示:

 

其中AddDll.h提供動態鏈接庫導出函數的聲明,Dlldemo.dll文件提供了實際導出函數的實現代碼,不過不再是源代碼的

形式。Dlldemo.lib提供了導出函數的一些符號列表。

 

至此動態鏈接庫便成功生成了。

 

 

下面我們用一個例子測試:

1.新建一個測試工程為test,在工程中添加一個test.cpp用於測試

 

2.將上面的三個文件拷貝到test工程目錄

 

3.將Dlldemo.lib用以下兩種方式中的一種鏈接到程序:

    一.通過工程-設置-鏈接-對象/庫模塊中 添加Dlldemo.lib

    二.或者在程序通過#pragma comment(lib,"Dlldemo.lib")

 

4.在test.cpp包含頭文件AddDll.h,同時用以下測試代碼:

 1 #include "AddDll.h"
 2 #include <iostream>
 3 using namespace std;
 4 #pragma comment(lib,"Dlldemo.lib")
 5 int main()
 6 {
 7     int num1,num2;
 8     cout<<"Please input the two number:"<<endl;
 9     cin>>num1;
10     cin>>num2;
11     int AddResult;
12     AddResult=Add(num1,num2);
13     cout<<"The Add Result is: "<<AddResult<<endl;
14     return 0;
15 }

運行結果:

 

測試成功咯!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM