2011-11-07 91 views
2

鑑於以下C++代碼沒有提到函數聲明中的調用約定,導出函數Exported的調用約定是什麼?我的猜測會是cdecl的默認值。導出函數(VS2008)的默認調用約定是什麼?

extern "C" 
{ 
    __declspec (dllexport) bool Exported(int parm); 
} 

我從託管代碼中調用這個函數,使用LoadLibraryGetProcAddressMarshal.GetDelegateForFunctionPointer。我可以使用UnmanagedFunctionPointer屬性的不同值來裝飾我的委託定義,並且它們全都似乎可以工作。

+0

強制客戶端程序員顯式使用CallingConvention屬性並沒有什麼意義,只是最大限度地發揮了錯誤的可能性。使用__stdcall。另外,在託管代碼中顯式調用LoadLibrary/GetProcAddress是非常不尋常的事情,這個pinvoke編組已經做到了。 –

+0

*在託管代碼中顯式調用LoadLibrary/GetProcAddress非常不尋常*。我同意。 – mackenir

+0

順便說一句,我是客戶端程序員 - 我檢查了我,我不介意必須指定CallingConvention;¬) – mackenir

回答

5

默認調用約定是cdecl。請注意,__declspec(dllexport)對調用約定沒有影響。

調用約定可以用代碼或編譯器選項指定。我不推薦使用編譯器選項,它有點太模糊。在代碼中明確表示,然後任何閱讀的人都知道使用了什麼約定。

請注意,對於64位Windows代碼,所有調用約定是等價的,這可以解釋您看到的內容。

+0

謝謝。我現在不想修改本機代碼,但同意在代碼中明確指定它是最好的選擇。 – mackenir

+0

在這種情況下,在託管代碼中指定cdecl –

+0

是的。 __________________ – mackenir

2

默認調用convetion還取決於一些編譯器開關:

在C/C++ - >高級,您可以設置:

/釓= CDECL,/ GZ = STDCALL,/石墨= FASTCALL

相關問題