在 Delphi 中,我将 AnsiString 数据发送到 C++ DLL 函数,但输入值丢失了。为什么会出现这种情况?

In Delphi, I send AnsiString Data to C++ DLL Function, but input value was lost. Why happened this situation?

我了解了一些更详细的问题。所以,我改变了问题。 感谢之前回答问题的人。

现在,这是一个详细的问题。 在delphi中,我将AnsiString类型的数据发送给DLL中的C++函数

在Delphi07

TFunctionA = function (aHandle: FunctionAHANDLE ; input: AnsiString): AnsiString; cdecl;
....
FunctionA('Test string value');

在 C++ DLL 中

    char * FunctionA(char *input){
       ....
    return pReturn;
    };

在这种情况下,我使用 Visual Studio 15 Debug 确认了数据(char *input),数据丢失了(AnsiString)

但在 Delphi 中,TFunctionA 的 Return 类型将 AnsiString 更改为 AnsiChar, 然后传输数据(char *input)("Test string value").

 TFunctionA = function (aHandle: FunctionAHANDLE ; input: AnsiString): AnsiChar; cdecl;

我不知道这种情况,因为我从未与 Delphi 合作过。

Delphi的AnsiString与C的char *类似,但绝对不是一回事。假设你的 C 函数是:

char * FunctionA(char *input){
   ....
return pReturn;
};

那么您的 Delphi 声明应该如下所示:

function FunctionA(Input: PAnsiString): PAnsiString; cdecl;

您将以这种方式使用它:

var
  SomeInput, SomeOutput: AnsiString;
begin
  SomeInput := 'foobar';
  SomeOutput := AnsiString(FunctionA(PAnsiChar(SomeInput)));
  Writeln(SomeOutput);
end;

给你先 "convert" (不是真的,但足够接近) AnsiString SomeInput 到 PAnsiChar,这是一个零终止的字符串,正好等于 C 的 char * .您将其传递给您的 C 函数,然后(真正)将 char * 结果(与 Delphi 的 PAnsiChar 相同)转换为 Delphi 的 AnsiString .

或者,如果您想用 C/C++ 术语来解释它,您有一个 C++ string,您可以使用 [=23] "convert" 到 char * =],然后借助 string(char *) 构造函数,基于 char * 创建一个新的 string