C dll呼叫 動態(顯式)

2022-07-29 23:03:39 字數 2891 閱讀 4668

廢話不說上**, 

dll 標頭檔案 j_test.h

#pragma once

extern"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 once

class

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程式設計中,預先申請一塊大的普通記憶體,在使用過程中需要將其中的一小塊轉換為乙個物件例項,在這種場景下就需...