Delphi 系統[16]關鍵字和保留字 cdecl、pascal、stdcall、safecall、register、varargs - 呼叫約定
阿新 • • 發佈:2021-08-12
Delphi 系統[16]關鍵字和保留字 cdecl、pascal、stdcall、safecall、register、varargs- 呼叫約定
1、定義:
- cdecl:規定了從C或C++編寫的DLL中呼叫函式所必須遵守的規則。它可以將C或C++中的資料型別轉換為Delphi的型別。
- pascal:規定引數從左向右傳遞。函式呼叫時要對所有的變數進行初始化,避免因非同步執行緒呼叫而產生的錯誤,保留它是為了向下相容。
- stdcall:規定引數從右向左傳遞。同時stdcall規定,被調函式是大小寫敏感的。在呼叫函式時,如果函式名中有一個字元的大小寫出錯,則該函式將呼叫失敗。
- safecall:規定被COM呼叫的函式所必須遵守的規則。在編譯時,safecall宣告的函式被編譯成與COM介面相容的。
- register:Delphi專用的函式呼叫協定,直接通過暫存器傳遞引數,因此傳遞速度非常塊。register關鍵字也被用來註冊控制元件。
- varargs:標示了引用引數,它必須和cdecl關鍵字聯用,表明允許呼叫的函式使用引用傳遞。
2、示例:
{ cdecl 它可以將C或C++中的資料型別轉換為Delphi的. } { 例如 C++ 中的程式碼 } int X(int i) { return i*2; } { 如果這個函式被編譯在Test.dll 中, 則用 Delphi 呼叫時必須使用如下方式 } function X(i: Integer): Integer; Cdecl; external 'Test.dll'; -------------------------------------------------------------------------------------- { pascal 對所有的變數初始化, 避免因非同步執行緒呼叫而產生的錯誤.它是向下相容的. } function Test(I, J, K, L: Integer): Integer; pascal; begin Result := I * J * K * L; end; -------------------------------------------------------------------------------------- { stdcall 必須在主調方和被調方之間形成配對.} Library Test; //被調方: function Fun1(I, J, K, L: Integer): Integer; stdcall; begin Result := I * J * K * L; end; exports Fun1; begin end. //主調方: function Fun1(I, J, K, L: Integer): Integer; stdcall; external 'Test.dll'; //注意:使用Stdcall關鍵字時, 被調函式是大小寫敏感的 -------------------------------------------------------------------------------------- { safecall 宣告的函式被編譯成COM介面相容的. } procedure Fun1(S: WideString); safecall; { 編譯後: } procedure Fun1(S: PAnsiString); -------------------------------------------------------------------------------------- { register 函式在被呼叫時可以在登錄檔內留下記錄.它是向下相容的.} function Fun1(I, J, K, L: Integer): Integer; register; begin Result := I * J * K * L; end; //關鍵字還用於向控制元件庫或是IDE 註冊控制元件或是專家工具. procedure Register; begin RegisterComponents('Sample', [TDemo]); end; -------------------------------------------------------------------------------------- { varargs 標識了引用引數, 它必須和Cdecl關鍵字聯用, 表明允許呼叫的函式使用引用傳遞. } { 這段程式碼從 C++ 的類庫中引用了 Printf 函式,並允許按引用的方式傳入引數 } function printf(Format: PChar): Integer; cdecl; varargs;
3、其他說明:連結
建立時間:2021.08.12 更新時間:
部落格園 滔Roy https://www.cnblogs.com/guorongtao 希望內容對你所有幫助,謝謝!