PInvoke調用導致堆棧不對稱 c#調用C++win32非托管dll的問題深度分析


問題描述:對 PInvoke 函數“xxFunction()”的調用導致堆棧不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標簽名不匹配。請檢查 PInvoke 簽名的調用約定和參數與非托管的目標簽名是否匹配

問題解決:1、在c#中函數聲明處改一個參數,[DllImport("xx.dll", EntryPoint=“xxFunction”, CallingConvention = CallingConvention.Cdecl)]調用時不變

     2、在c++代碼中改對應的c++函數參數從extern“C” _declspec(dllexport) void xxFunction()改成

       extern“C” _declspec(dllexport) void __stdcall xxFunction()

問題分析:

     在c++WIN32程序中有三種calling convention(呼叫約定):__cdecl, __stdcall, __fastcall默認為__cdecl,而c#中默認為CallingConvention =CallingConvention.Winapi,兩個平台呼叫約定不一致,所以會出現提示的不匹配錯誤。

__cdecl為調用函數即C#中清理堆棧中保存的參數。參數的大小不確定時用這個,比如string

 __stdcall對應c#中CallingConvention =CallingConvention.Winapi,它由c++中函數自動清理。

Win32 calling convention(呼叫約定)的三種約定具體分析見http://www.cnblogs.com/super119/archive/2011/04/10/2011304.html

http://www.cnblogs.com/dust/articles/1190641.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM