[BCB] DLL 加不加 __stdcall 的差別

>>> 同事問我的,我回他的內容做個筆記XD  <<
 
在.dll 的聲明中如果是:
extern "C" __declspec(dllexport) __stdcall int Myfunction_Add(int x,int y)

extern "C" __declspec(dllexport) int Myfunction_Add(int x,int y)
兩種方法在dll中導出的函數不同。
用__stdcall聲明的導出的時候函數名稱不會有變化,
而採用第二種的方法時候,系統會在函數名稱前加一個 "_",
等同於 extern "C" __declspec(dllexport) __cdecl int Myfunction_Add(int x,int y)

例如:
.dll內:
extern "C" __declspec(dllexport) __stdcall int Myfunction_Add(int x,int y)
{
 int z = x + y;
 return z;

在調用程式.cpp :
int (*Myfunction_Add)(int,int);
HINSTANCE hInst=LoadLibrary("my.dll");
(FARPROC &) Myfunction_Add = GetProcAddress(hInst, "Myfunction_Add");
int sum = Myfunction_Add(10,20);
ShowMessage(sum);
FreeLibrary(hInst);
注意:如果聲明的時候不用__stdcall,
則在(FARPROC &) Myfunction_Add = GetProcAddress(hInst, "Myfunction_Add");中在Myfunction_Add前加下劃線。
變成(FARPROC &) Myfunction_Add = GetProcAddress(hInst, "_Myfunction_Add");

留言