回顧一下C++ 編寫DLL
阿新 • • 發佈:2018-04-30
short 導出函數 article details depends 開始 工程 https -i
項目模版使用Win32工程創建的dll項目
一、原始代碼
使用depends查看導出函數
二、不同編譯方式區別
C方式編譯(extern "C"):
- __stdcall調用約定:輸出名稱在原名稱前加一下劃線,後面再加上一個“@”和其參數的總字節數(_原名稱@參數總字節數),如名稱int Func_C_stdcall(int a,int b)輸出為_Func_C_stdcall@8;
- __cdecl調用約定:與原名稱相同,如名稱int Func_C_cdecl(int a,int b)輸出還是為Func_C_cdecl;
C++方式編譯(extern "C++"):
__stdcall調用約定:
- 輸出名稱以“?”開始,後跟原名稱;
- 原名稱後再跟“@@YG”,後面再跟返回值代號和參數表代號,代號表示如下:
X--void ,
D--char,
E--unsigned char,
F--short,
H--int,
I--unsigned int,
J--long,
K--unsigned long,
M--float,
N--double,
_N--bool,
...
PA--表示指針,後面的代號表明指針類型,如果相同類型的指針連續出現,以“0”代替,一個“0”代表一次重復; - 參數表後以“@Z”標識整個名字的結束,如果該函數無參數,則以“Z”標識結束。如名稱int Func_CPP_stdcall(int a,int b)編譯後的輸出名稱為?Func_CPP_stdcall@@YGHHH@Z。
__cdecl調用約定:與_stdcall調用約定基本一致,只是參數表的開始標識由上面的“@@YG”變為“@@YA”。如名稱int Func_CPP_cdecl(int a,int b)編譯後輸出名稱為?Func_CPP_cdecl@@YAHHH@Z。
編譯C文件和編譯CPP文件,不需加extern "C"和extern "C++",因為編譯C文件當然默認的是extern "C",而編譯CPP文件則默認的是extern "C++"。
第二部分轉自:https://blog.csdn.net/beanjoy/article/details/9136127
回顧一下C++ 編寫DLL