gpt4 book ai didi

c++ - 通过 PAnsiChar (char *) 传递 AnsiString 是否明确需要空终止符?

转载 作者:太空狗 更新时间:2023-10-29 20:25:29 25 4
gpt4 key购买 nike

作为新手,对于互操作和 C(++) 我确实搜索了这个问题的答案,但在 SO 或 www 上找不到。我没有选择正确的词来搜索答案,或者我错过了这个非常基本的问题的要点......

对于 Delphi dll 和“C(++) dll caller”之间的互操作,您是否明确声明 Delphi dll 中的空终止符以传递回 dll 调用者?

例如Dll调用者(C代码)

char ErrorMessage[10];
(*GetMessageFromDLLFunction)(&ErrorMessage[0], 10); // (char * ErrorMessage, int buffSize)

Dll 代码(德尔福):

GetMessageFromDLLFunction(errorMessage: PAnsiChar; buffSize: Integer)

// What if the message generated in this function exceeds 10 characters?
// do I return 9 characters and a null terminator?
tmpMessage := SetLength(tmpMessage, buffSize-1);
tmpMessage := tmpMessage + #0;
System.AnsiStrings.StrCopy(errorMessage,PAnsiChar(tmpMessage));

// or do I return 9 characters without an explicit null terminator?
tmpMessage := SetLength(tmpMessage, buffSize-1);
System.AnsiStrings.StrCopy(errorMessage,PAnsiChar(tmpMessage));

什么是最佳/正确做法?

最佳答案

如果您返回的字符串有时以 null 结尾,有时则不是,那么您会给调用者带来沉重的复杂性负担。有时,调用者必须添加空终止符。调用者面临一个尴尬的局面,即缓冲区中的字符串太短一个字符而无法包含空终止符。通常最好将复杂性降低到尽可能低的水平,所以我的感觉是,在所有条件相同的情况下,您应该始终返回一个以 null 结尾的缓冲区。

您的代码目前没有尝试通知用户需要多大的缓冲区来存储完整的字符串。您可以继续这样做,但我绝对建议您确保返回值始终以 null 结尾。看起来像这样:

function GetString(Buffer: PAnsiChar; Len: Integer): Integer;
var
Value: AnsiString;
begin
if Len < 1 then
begin
Result := STATUS_INVALID_PARAMETER;
exit;
end;

Value := ... // get the string to be returned somehow
StrLCopy(Buffer, PAnsiChar(Value), Len - 1);
if Length(Value) < Len then
Result := STATUS_OK
else
Result := STATUS_BUFFER_TOO_SHORT;
end;

或者,您可以修改接口(interface),让调用者知道需要多大的缓冲区。这可能看起来像这样:

function GetString(Buffer: PAnsiChar; var Len: Integer): Integer;
var
Value: AnsiString;
begin
if Len < 0 then
begin
Result := STATUS_INVALID_PARAMETER;
exit;
end;

Value := ... // get the string to be returned somehow
if Len > 0 then
StrLCopy(Buffer, PAnsiChar(Value), Len - 1);
if Length(Value) < Len then
Result := STATUS_OK
else
Result := STATUS_BUFFER_TOO_SHORT;
Len := Length(Value) + 1;
end;

关于c++ - 通过 PAnsiChar (char *) 传递 AnsiString 是否明确需要空终止符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23881808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com