廢話不說上**,dll 標頭檔案 j_test.h
#pragma onceextern"c
"_declspec(dllexport) void maopao(int *p, int
count);
extern"c
"_declspec(dllexport) int test(int *p, char*count);
extern"c
"_declspec(dllexport) int sum(int i1, int
i2);
class
j_test
;
dll 實現類 j_test.cpp
#include "j_test.h
"j_test::j_test()
j_test::~j_test()
void maopao(int *p, int
count)}}
}int test(int *p, char*count)
int sum(int i1, int
i2)
呼叫方 標頭檔案
goo.h
#pragma onceclass
goo;
goo.cpp
#include "goo.h
"goo::goo()
goo::~goo()
#include
#include
#include
typedef
int(*dllfun)(int *, int
);typedef
int(*testfun)(int *, char *);
typedef
int(*sumfun)(int , int
);using
namespace
std;
intmain()
maopao1 = (dllfun)getprocaddress(hdll, "
maopao");
if (maopao1 ==null)
int a[10
]; srand(time(
0));
for (int i = 0; i<10; i++)
a[i] = rand() % 50
; maopao1(a,
10);
for (int i = 0; i<10; i++)
cout
<< a[i]
char cs[10
]; testfun testfun = (testfun)getprocaddress(hdll, "
test");
b =testfun(a, cs);
cout
<< "
cs = ..............
"
cout
<< cs[i]
<< "b="
<< b
<< "
sumfun = ..............
"
sum"
); b = sumfun(3, 4
); cout
<< "b="
<< b
>b; freelibrary(hdll);
}
c++如何呼叫dll呢,有兩種,一種是靜態,另外一種是動態,即通過呼叫windowsapi 來載入和解除安裝dll,具體思路:
1.先編寫乙個dll, 可以沒有單獨的標頭檔案,因為很多情況下的dll都是沒有和lib和標頭檔案一起的。
2.然後另外新建乙個專案,來呼叫dll,方法是:
1.宣告標頭檔案,說明我想用windows32方法來載入和解除安裝dll
2.然後用typedef定義乙個指標函式型別.typedef void(*fun) //這個指標型別,要和你呼叫的函式型別和引數保持一致,記住,是指標引數就是(int *,int)
3.定乙個控制代碼例項,用來取dll的例項位址。hinstance hdll;
格式為hdll=loadlibrary(「dll位址」);這裡字串型別是lpstr,當是unicode字符集的時候會不行,因此要在配置-屬性-常規裡面把預設字符集「unicode」改成支援多字元擴充套件即可。
4.取的位址要判斷,返回的控制代碼是否為空,如果為無效控制代碼,那麼要釋放載入dll所占用的記憶體。
freelibrary(hdll);
5.然後定義乙個函式指標,用來獲取你要用的函式位址,這個咋用呢?
先是定乙個函式指標 fun fun;然後通過getprocadress來獲取函式的位址,這個函式引數是什麼呢?
引數是dll的控制代碼和你要呼叫的函式名:比如:fun=(fun)getprocadress(hdll,"sum");
這裡也要判斷要函式指標是否為空,如果沒取到要求的函式,那麼要釋放控制代碼
freelibrary(hdll);
6.然後通過函式指標來呼叫函式。
fun(int *p,int count);這裡不能用函式名來使用函式,因為這個dll本身不是當前cpp的一部分,而是通過windows去呼叫.沒有在這個工程裡宣告或者定義,而是暴露出乙個頭,要指標獲取他的位址,通過指標來呼叫.
最後呼叫結束後,就釋放控制代碼
freelibrary(hdll);
這裡只是通過動態載入沒有涉及到靜態的。這個在後續會學習。
來自 :linux 動態度的顯式呼叫
學習linux,你可能會遇到動態庫的顯式呼叫,這裡將介紹動態庫的顯式呼叫的解決方法,在這裡拿出來和大家介紹下。顯式呼叫的含義是 出現庫檔名,使用者需要自己去開啟和管理庫檔案。其要點為 把dlfcn.h系統標頭檔案包含進來 用dlopen函式開啟庫檔案,並指定開啟方式 dllope的的第乙個引數為共享...
闡述Linux動態庫的顯式呼叫
十年的發展,linux系統已經趕上了微軟,於是很多人開始學習linux時,學習linux,你可能會遇到動態庫的顯式呼叫,這裡將介紹動態庫的顯式呼叫的解決方法,在這裡拿出來和大家介紹下。顯式呼叫的含義是 出現庫檔名,使用者需要自己去開啟和管理庫檔案。其要點為 把dlfcn.h系統標頭檔案包含進來 用d...
顯式呼叫建構函式
class的建構函式,是在生成物件例項時系統自動呼叫的,一般來講開發著一般不能直接呼叫建構函式。但是在某些特殊用法下開發人員需要呼叫建構函式來完成,物件例項的生成。例如 在memory pool程式設計中,預先申請一塊大的普通記憶體,在使用過程中需要將其中的一小塊轉換為乙個物件例項,在這種場景下就需...