CallingConvention理解


CallingConvention理解

有以下幾個值可以使用:Cdecl, FastCall, StdCall, ThisCall, Winapi.

Cdecl:由調用者清理棧資源。非常適合用在可變參數的函數調用上,例如printf.

FastCall: Calling convention不支持。

StdCall:由被調用者清理棧資源。這是調用native函數時默認的方式。

ThisCall:第一個參數是this指針,會被存儲在ECX寄存器里,而其它的參數會被壓棧。這種方式通常用在調用未托管的DLL的方法或類。

Winapi:實際上並不是一個calling convention,實際上會被默認的平台的calling convention替代。例如window上調用,會替換成StdCall,Windows CE.NET上則被替換成Cdecl.

小例子:

using namespace System;
using namespace System::Runtime::InteropServices;
public ref class LibWrap
{
public:

   // CallingConvention.Cdecl must be used since the stack is 
   // cleaned up by the caller.
   // int printf( const char *format [, argument]... )

   [DllImport("msvcrt.dll",CharSet=CharSet::Unicode, CallingConvention=CallingConvention::Cdecl)]
   static int printf( String^ format, int i, double d );

   [DllImport("msvcrt.dll",CharSet=CharSet::Unicode, CallingConvention=CallingConvention::Cdecl)]
   static int printf( String^ format, int i, String^ s );
};

int main()
{
   LibWrap::printf( "\nPrint params: %i %f", 99, 99.99 );
   LibWrap::printf( "\nPrint params: %i %s", 99, "abcd" );
}

鏈接來源這里


免責聲明!

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



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