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之後...