如果我定义以下过程:
procedure get_String(var aStringPtr: PAnsiChar);
function set_ReturnValue(aInputValue: AnsiString) : PAnsiChar; overload;
var
iLen: Integer;
begin
iLen := Length(aInputValue);
Result := AnsiStrAlloc(iStringLen + 1);
System.AnsiStrings.StrPLCopy(Result, aInputValue, iLen);
end;
var
iData: AnsiString;
begin
iData := 'Hello World';
aStringPtr:= set_ReturnValue(iData);
end;
我可以调用“get_String()”过程并通过执行以下代码获取字符串:
var
iMyStr: PAnsiChar;
begin
get_String(iMyStr);
我正在尝试创建一个返回正确填充的记录指针的“get_Record()”过程,但没有成功:
TMyDataRec = record
ProductID: Integer;
DownloadURL: WideString;
MaintenanceDate: AnsiString;
end;
type
TMyDataRecPtr = ^TMyDataRec;
procedure get_Record(var aRecordPtr: TMyDataRecPtr);
var
iData: TMyDataRec;
begin
iData.ProductID := 1;
iData.DownloadURL := 'www.thisisatest.com';
iData.MaintenanceDate := '02/29/2023';
aRecordPtr := <...>
end;
如何填充“aRecordPtr”以便调用“get_Record()”过程返回正确的数据?
到目前为止,我的所有尝试都导致了访问冲突。
通常记录和记录指针一起声明,如下所示:
type
PMyDataRec = ^TMyDataRec;
TMyDataRec = record
ProductID: Integer;
DownloadURL: WideString;
MaintenanceDate: AnsiString;
end;
// Note that the `PMyDataRec` pointer can be defined before the
// `TMyDataRec` record, if done in the same 'type' block.
您会遇到访问冲突,因为您依赖堆栈内存,当过程退出时堆栈内存不再存在。 您需要使用
New()
方法为记录分配内存。
procedure get_Record(var aRecordPtr: PMyDataRec);
var
// iData: TMyDataRec;
iData: PMyDataRec;
begin
new(iData); // this is missing
iData.ProductID := 1;
iData.DownloadURL := 'www.thisisatest.com';
iData.MaintenanceDate := '02/29/2023';
aRecordPtr := iData; //<...>
end;
还要注意,不需要
iData
记录指针,可以直接对aRecordPtr
参数进行操作。