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

问题描述:

我了解了一些更详细的问题。所以,我改变了问题。 感谢以前有关回答的问题的人。在Delphi中,我发送AnsiString数据到C++ DLL函数,但输入值丢失。为什么发生这种情况?

现在,这是一个详细的问题。 在Delphi中,我在DLL

发送AnsiString类型类型的数据,以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,数据丢失(AnsiString)

但在Delphi中,TFunctionA的返回类型将AnsiString更改为AnsiChar, ,然后传输数据(char *输入)(“测试字符串值”)。

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

我不知道这种情况,因为我从来没有与德尔福合作过。

+1

代码中存在一个错误。不是特别有用,但最好的人都可以不用[mcve]或水晶球为你做。 – user4581301

+1

什么是CString?一个包含字符串的C++类?如果是这样,德尔福将无法使用它。什么是“其他功能”,它有什么作用?就像@ user4581301所说的那样,显示一个[mcve]。目前还不清楚你的模糊描述是怎么回事。 –

+1

代码中存在缺陷。无论是自己调试还是显示MCVE。 –

德尔福的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; 

在这里,你先“转换“(不是真的,但足够接近)AnsiString SomeInput为PAnsiChar,它是一个零终止的字符串,完全等于C的char *。你将它传递给你的C函数,然后将(真的)char *结果(与Delphi的PAnsiChar相同)转换为Delphi的AnsiString

或者,如果你要解释它在C/C++来说,你有一个C++ string,您可以使用string::c_str()“转换”到char *,然后根据char *得益于string(char *)构造函数创建一个新的string