1. 程式人生 > >DLL呼叫(1):C++靜態呼叫DLL

DLL呼叫(1):C++靜態呼叫DLL

DLL(Dynamic Link Library)即動態連結庫,DLL檔案中存放封裝的函式和類,當程式需要呼叫DLL所定義的功能時,需要先載入DLL檔案,然後取得函式的地址,最後進行呼叫。
通過DLL來呼叫功能,可實現程式碼的封裝與複用,去除功能之間的耦合,有利於模組化。降低應用難度的同時,也可以實現智慧財產權的保護。
DLL檔案是Windows作業系統下定義的檔案,可被多種語言呼叫。這裡首先介紹如何被C++呼叫。(本系列中DLL的原始碼為C++程式碼)
C++呼叫採用的程式設計IDE為Visual Studio 2015。
靜態呼叫也被稱為隱式呼叫,即在呼叫程式的開始即載入DLL,在程式中直接使用DLL功能,就像使用程式中的其他函式一樣,不能直接看出哪個函式是DLL函式。
首先定義DLL檔案,在這裡還是採用標準的.h和.cpp對應檔案方式。testDLL.h中宣告函式。最簡化舉例,以下一行程式碼即可。

extern "C" __declspec(dllexport) int Add(int *a, int *b);

testDLL.cpp檔案實現函式功能,需要以下程式碼。

#include "testDLL.h"
int Add(int *a, int *b){
    return *a + *b;
}

可見,這個簡單的例子是實現兩個整型數的加法,以上兩個檔案即可生成testDLL.lib檔案和testDLL.dll檔案。
那靜態呼叫DLL功能,需要再程式開頭引入DLL對應的LIB檔案,此時LIB檔案要放置在可以找到的庫檔案目錄中。

#pragma comment(lib,"testDLL.lib")

當然,要宣告用到的函式,一般來說,DLL工程會提供合理的標頭檔案,直接include即可。不過本例過於簡單,用一句話代替DLL標頭檔案。

extern "C" __declspec(dllimport) int Add(int *a, int *b);

這時,就可以像呼叫其他函式一樣,呼叫DLL中的Add函式,實現功能了。注意,要把testDLL.dll檔案放在exe檔案同目錄,或者環境變數可以找到的目錄中。