Delphi 正在用“传递DLL函数参数”;常数;指针的等价物?

Delphi 正在用“传递DLL函数参数”;常数;指针的等价物?,delphi,dll,pass-by-reference,calling-convention,stdcall,Delphi,Dll,Pass By Reference,Calling Convention,Stdcall,数据块: PMyDataBlock = ^MyDataBlock; MyDataBlock = record // ............. end; 定义如下: function MyFunction(const pstSettings: MyDataBlock): HRESULT; stdcall; external 'MyLib.dll' name 'MyFunction'; 完全等同于此 function MyFunction(pstSettings: PMyDataBlock

数据块:

PMyDataBlock = ^MyDataBlock;
MyDataBlock = record
  // .............
end;
定义如下:

function MyFunction(const pstSettings: MyDataBlock): HRESULT; stdcall; external 'MyLib.dll' name 'MyFunction';
完全等同于此

function MyFunction(pstSettings: PMyDataBlock): HRESULT; stdcall; external 'MyLib.dll' name 'MyFunction';
简短的回答是“不,不是”

在您的情况下,您的记录可能通过引用传递,也可能不通过引用传递。记录的大小是我知道的影响行为的因素之一。如果您的记录是4字节或更少,我相信它将通过值传递,否则,它将通过引用传递。我不相信这种行为是契约性的(换句话说,Embarcadero在未来的任何时候都可以自由改变它)。换句话说,使用const参数调用外部函数是个坏主意

如果要通过引用传递记录,正确的方法是声明它
var

function MyFunction(var pstSettings: MyDataBlock): HRESULT; stdcall; external 'MyLib.dll' name 'MyFunction';

或者将其作为指针传递。

const
仅对Delphi编译器具有特殊语义。我不会在外部函数声明中使用它。不,它并不等同于指针。这取决于参数的类型。例如,
const Integer
不是
PInteger
,但还有更多…另请参见。Peter Wolf,外部函数已经声明并用C编写。我指的是Delphi代码中的外部函数声明(您在DLL中引用函数)。由于Delphi 10.4,您可以使用
[Ref]
decorator。您应该仍然能够使用
PMyDataBlock(nil)^
传递
nil
,尽管我没有尝试过。我仍然不建议在外部函数中使用它。常量记录大小小于或等于指针大小,意味着编译器可以自由地按值传递它。除非您使用[Ref]在最近的Delphi版本中引入了decorator。