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編...