gpt4 book ai didi

String 到 PAnsiChar 转换麻烦

转载 作者:行者123 更新时间:2023-12-03 18:20:46 26 4
gpt4 key购买 nike

这些是 C DLL 函数示例及其 Delphi 翻译:

C 定义:

DLL_EXPORT int AR_dll_function (const char *terminal_no, const char *description);

德尔福定义:

function Ar_Dll_Function(const TerminalNo: PAnsiChar; const Description: PAnsiChar):Integer;

...

function Ar_Dll_Function(const TerminalNo: PAnsiChar; const Description: PAnsiChar):Integer;
var
MyFunct : function(const TerminalNo: PAnsiChar; const Description: PAnsiChar):Integer;cdecl;
begin
Result := 0;
@MyFunct:=GetProcAddress(HInst,'ar_dll_function');
if Assigned(MyFunct) then
Result := MyFunct(TerminalNo, Description);
end;

我像这样使用上面的 Delphi 函数:

function SP(const s:string): PAnsiChar;
var
UTF8Str: RawByteString;
begin
Result := #0;
SetCodePage(UTF8Str, 0, False);
UTF8Str := UTF8Encode(s);
Result := PAnsiChar(AnsiString(UTF8Str));
end;

...

result := Ar_Dll_Function(SP(dTermNo),SP(descr));

问题出在两个 PAnsiChar 参数之间。当我在 Debug模式下进入 DLL 函数时,我看到第二个 PAnsiChar 通常与第一个参数相同,或者与函数名称相同:

//parameter examples in string :
dtermno:='AT0000058863'; descr:='NAKİT';

//parameter examples in PAnsiChar :
TerminalNo:='AT0000058863'; const Description:='AT0000058863'; //or
TerminalNo:='AT0000058863'; const Description:='ar_dll_function';

我该如何解决这个问题?

最佳答案

您遇到的问题是 SP 返回属于 SP 中局部变量的字符串缓冲区的地址。因此,当 SP 返回时,该变量被销毁,指针现在无效。

我会这样调用函数:

var
dTermNo, descr: string;
....
dTermNo := ...;
descr := ...;
retval := Ar_Dll_Function(PAnsiChar(UTF8String(dTermNo)), PAnsiChar(UTF8String(descr)));

或者,您可以将 UTF-8 编码下推到 Ar_Dll_Fu​​nction 包装器:

function Ar_Dll_Function(const TerminalNo, Description: string): Integer;
var
MyFunct: function(TerminalNo, Description: PAnsiChar): Integer; cdecl;
begin
Result := 0;
@MyFunct := GetProcAddress(HInst, 'ar_dll_function');
if Assigned(MyFunct) then
Result := MyFunct(PAnsiChar(UTF8String(TerminalNo)),
PAnsiChar(UTF8String(Description)));
end;

关于String 到 PAnsiChar 转换麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47905408/

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