c c 中 stdcall與dll動態呼叫

2021-08-15 00:25:14 字數 1130 閱讀 5684

1._stdcall在動態dll呼叫中的注意事項

為了用vc寫的dll能被其它語言的寫的程式使用,即實現跨語言。我們在dll的函式呼叫約定中使用__stdcall .

但當用getprocaddress呼叫是卻失敗了.

用dumpbin工具檢視匯出的函式名可以看到:匯出的函式名確實為_mygetgrad@20

所以我們要阻止匯出的函式名被編譯器修改,方法就是使用def檔案

; ***.def : declares the module parameters for the dll.

library      "***"

exports

; explicit exports can go here

mygetgrad@1

這樣重新呼叫getprocaddress就正確了

並且在函式指標定義和getprocaddress時必須把__stdcall 加上否則執行時會報錯

void (

_stdcall 

*mygetgrad)(unsigned char*, unsigned char*, int, int, long);

2. .c檔案中函式中間宣告變數有時會報錯,把宣告放到最前面就ok,不知道為啥

3.動態載入要#include

4.loadlibrarya與loadlibrary

loadlibrary動態載入dll失敗,把loadlibrary改為loadlibrarya就ok

hmodule hdllinst;

void (_stdcall *mygetgrad)(unsigned char*, unsigned char*, int, int, long);

hdllinst = null;

mygetgrad = null;

hdllinst = loadlibrarya("fignerprintanalysis.dll");

mygetgrad = (void (_stdcall *)(unsigned char*, unsigned char*, int, int, long))getprocaddress(hdllinst,"mygetgrad"); 參考

vc 中stdcall與cdecl的相關知識

stdcall 和 cdecl 都屬於呼叫方式 一般我們在宣告函式時都沒有顯示的說明呼叫方式,因為不同語言都有不同的預設呼叫方式 能否實現變參 stdcall stdcall是pascal程式的預設呼叫方式,通常用於win32 api中,由主呼叫函式採用從右到左的壓棧方式進行引數壓棧,然後由被呼叫者...

C C 中 與 運算

int i 5 int i pointer i i,i pointer,i pointer 的值各是什麼呢?和 是同優先順序運算子,自右至左結合。是取位址運算 是取位址的本身 知道了上述內容,就不難知道上面的問題了。i,i取i位址,i 取位址的本身,那就是等於i本身了。i pointer,i poi...

C,C 巨集中 與 詳解

文中 file 與示例1可以參見 使用 ansi c and microsoft c 中常用的預定義巨集 巨集中的 的功能是將其後面的巨集引數進行字串化操作 stringizing operator 簡單說就是在它引用的巨集變數的左右各加上乙個雙引號。如定義好 define string x x之後...