1. 程式人生 > 其它 >Delphi 系統[16]關鍵字和保留字 cdecl、pascal、stdcall、safecall、register、varargs - 呼叫約定

Delphi 系統[16]關鍵字和保留字 cdecl、pascal、stdcall、safecall、register、varargs - 呼叫約定

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 希望內容對你所有幫助,謝謝!