字符串到PAnsiChar转换麻烦

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串到PAnsiChar转换麻烦相关的知识,希望对你有一定的参考价值。

这些是C DLL函数示例及其Delphi转换:

C定义:

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

Delphi定义:

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参数之间。当我在调试模式下进入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_Function包装器:

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;

以上是关于字符串到PAnsiChar转换麻烦的主要内容,如果未能解决你的问题,请参考以下文章

在 Delphi 2009 中将字符串转换为 PAnsiChar

在delphi中Pansichar是啥类型

将字符串 XML 片段转换为 Java 中的文档节点

HTTP转换为null什么意思?

char *转为pansichar

10个JavaScript代码片段,使你更加容易前端开发。