動態鏈結庫DLL 的封裝及呼叫

2021-09-12 02:52:25 字數 3860 閱讀 8568

1.動態鏈結庫dll的封裝方法

封裝步驟

(1),在vs2010中新建乙個win32->dll工程;

(2),新建乙個標頭檔案dll4.h

#ifndef dll1_api

#define dll1_api extern "c" _declspec (dllimport)

#endif

dll1_api int add(int a , int b);

(3),新建乙個cpp檔案dll4.cpp

#include "stdafx.h"

#define dll4_api extern "c" _declspec(dllexport)

#include "dll4.h"

int add(int a , int b)

編譯生成

在debug資料夾中會生成相應的dll檔案:*.dll

2,動態鏈結庫dll的呼叫方法

新建乙個win32的控制台應用程式usedll

#include "stdafx.h"

#include#include//這個標頭檔案非常重要,必須加上!

using namespace std;

typedef int(*add)(int a, int b);//這裡的add形式上和我們生成的dll檔案中的函式一致,我們的dll中定義的函式有兩個整型引數,因此這裡也是int a,int b

int main()

//如果通過上面則表明載入成功了,下面我們需要取出dll裡面函式的位址

add add_obj = (add)getprocaddress(hdll, "add");//此處兩個引數乙個是我們的控制代碼,另外乙個是dll中函式名,取出來給add_obj

//同樣,取址是否成功呢?判斷一下!

if (add_obj == null)

else

//獲取函式位址成功後,我們就可以使用dll中的函式了

cout << add_obj(3, 5) << endl;

freelibrary(hdll);

return 0;

}

要將dll4.dll拷貝到usedll工程目錄的debug下。

呼叫乙個已經寫好的動態庫,calckey.dll

#include#include//這個標頭檔案非常重要,必須加上!

using namespace std;

typedef int(__stdcall *calc_key)(in int keytype,in int secno,in unsigned char *csn,in unsigned char *cardno,out unsigned char *key);//這裡的dllfun形式上和我們生成的dll檔案中的函式一致,我們的dll中定義的函式有兩個整型引數,因此這裡也是int a,int b

int main()

; char pathdll[max_path]=;

//hinstance

hmodule hdll;//定義乙個控制代碼例項,來獲取dll的d例項位址

//這裡為簡單起見,我們直接將生成的multiply.dll檔案複製到當前專案下,否則下面一句你需要替換成dll的位址

getmodulefilename(null, pathdll, max_path);

*(strrchr(pathdll, '\\') + 1) = '\0';//絕對路徑

char dcp3_path[512] = ;

strcpy_s(dcp3_path, pathdll);

strcat_s(dcp3_path, "calckey.dll");

hdll = loadlibraryex(dcp3_path, null, load_with_altered_search_path);

//下面判斷當前dll是否載入成功

if (hdll == null)

//如果通過上面則表明載入成功了,下面我們需要取出dll裡面函式的位址

calc_key add_obj = (calc_key)getprocaddress(hdll, "calc_key");//此處兩個引數乙個是我們的控制代碼,另外乙個是dll中函式名,取出來給add_obj

//同樣,取址是否成功呢?判斷一下!

if (add_obj == null)

else

//獲取函式位址成功後,我們就可以使用dll中的函式了

cout << add_obj(0,1,(unsigned char*)"cd1f37ab",(unsigned char*)"370517990001345",bf2) << endl;

freelibrary(hdll);

return 0;

}

返回值 =0表示成功

返回值 =1表示失敗

注意呼叫約定__stdcall,封裝和呼叫時要一致

#include#include//這個標頭檔案非常重要,必須加上!

using namespace std;//呼叫約定

typedef int(__stdcall *calc_key)(in int keytype,in int secno,in unsigned char *csn,in unsigned char *cardno,out unsigned char *key);

int main()

; unsigned char bf1[250]=;

unsigned char bf2[250]=;

memset(bf,0x31,250);

memset(bf1,0x32,250);

char pathdll[max_path]=;

//hinstance

hmodule hdll;//定義乙個控制代碼例項,來獲取dll的例項位址

//這裡為簡單起見,我們直接將生成的multiply.dll檔案複製到當前專案下,否則下面一句你需要替換成dll的位址

getmodulefilename(null, pathdll, max_path);

*(strrchr(pathdll, '\\') + 1) = '\0';//絕對路徑

char dcp3_path[512] = ;

strcpy_s(dcp3_path, pathdll);

strcat_s(dcp3_path, "calckey.dll");

hdll = loadlibraryex(dcp3_path, null, load_with_altered_search_path); //載入生成的dll檔案,因為我們把生成的dll檔案複製到當前專案目錄下了,所以直接寫就行了

//下面判斷當前dll是否載入成功

if (hdll == null)

//如果通過上面則表明載入成功了,下面我們需要取出dll裡面函式的位址

calc_key add_obj = (calc_key)getprocaddress(hdll, "calc_key");//此處兩個引數乙個是我們的控制代碼,另外乙個是dll中函式名,取出來給add_obj

//同樣,取址是否成功呢?判斷一下!

if (add_obj == null)

else

//獲取函式位址成功後,我們就可以使用dll中的函式了

//cout << add_obj(0,1,) << endl;

cout << add_obj(0,1,(unsigned char*)"cd1f37ab",(unsigned char*)"370517990001345",bf2) << endl;//強制型別轉換

freelibrary(hdll);

return 0;

}*/

呼叫動態鏈結庫(dll)

步驟 1.tools options projects and solutions vc directories分別在包含檔案,庫檔案填加了路徑 這些路徑只告訴編譯器怎麼找檔案,沒有說把那裡面的檔案加入工程.若不設定,編譯報錯 無法開啟 檔案 2.project properties c c gen...

動態呼叫鏈結庫(dll) 續

最近一周做了乙個關於倉庫管理,揀貨任務分配的模組,其中涉及到刷卡自動列印領取任務的功能點。技術點 c 呼叫c delphi的動態鏈結庫。動態鏈結庫的呼叫方法不同。效果也不相同。dll位置 執行程式根目錄下面 例 第一種 dllimport shuipiao1.dll entrypoint check...

linux 動態鏈結庫so的封裝及呼叫

首先定義hello.c檔案 include void hello const char name 定義hello.h標頭檔案 ifndef hello h define hello h int g count 100 void hello const char name endif hello h編...