在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;
我不知道这种情况,因为我从来没有与德尔福合作过。
答
德尔福的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
。
代码中存在一个错误。不是特别有用,但最好的人都可以不用[mcve]或水晶球为你做。 – user4581301
什么是CString?一个包含字符串的C++类?如果是这样,德尔福将无法使用它。什么是“其他功能”,它有什么作用?就像@ user4581301所说的那样,显示一个[mcve]。目前还不清楚你的模糊描述是怎么回事。 –
代码中存在缺陷。无论是自己调试还是显示MCVE。 –