传递带有 "const" 的 DLL 函数参数等同于指针吗?
Is passing a DLL function argument with "const" an equivalent to pointer?
数据块:
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';
或将其作为指针传递。
数据块:
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';
或将其作为指针传递。