簡體   English   中英

PInvoke的意外調用約定

[英]Unexpected calling convention for PInvoke

我在dll及其標頭文件中有一個庫,但沒有源文件。 我需要使用pinvoke從C#調用此非托管代碼,但是在設置調用約定時遇到問題。 頭文件如下所示:

#ifdef EVOLIB_EXPORTS
#define EVOLIB_API __declspec(dllexport)
#else
#define EVOLIB_API __declspec(dllimport)
#endif
extern EVOLIB_API int ConvertRVBtoK(char *FileNameIn, char *FileNameOut,int ColorSmooth,int BlackMode);

我認為ConvertRVBtoK調用約定必須為__cdecl因為這是默認的c / c ++調用約定。 但是,當我使用undname.exe實用程序檢查修飾的名稱(“?ConvertRVBtoK @@ YGHPAEJJJ0E @ Z”)時,結果將顯示__stdcall作為調用約定。 為什么? dll文件和頭文件之間是否有沖突?

頭文件根本沒有指定調用約定。 因此,現在您取決於編譯器的默認設置。 在MSVC ++ IDE中使用“項目”>“屬性”>“ C / C ++”>“高級”>“調用約定”設置進行配置。 正如您所期望的那樣,默認值為/ Gd,將其更改為/ Gz作為Q&D修復並不罕見。

小心更改它,您可能會在其互操作代碼中破壞依賴於stdcall的其他程序。 請注意,您之前曾詢問過pascal約定,即32位代碼中的stdcall。 在頭文件中是顯式的,因此您不必依賴編譯器的默認值也不會受到損害。

如果沒有源代碼,則無法更改它。 stdcall沒什么特別的錯誤,它是Windows上預期的互操作默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM