Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 演员AnsiString(myPAnsiChar)实际上做什么?_Delphi - Fatal编程技术网

Delphi 演员AnsiString(myPAnsiChar)实际上做什么?

Delphi 演员AnsiString(myPAnsiChar)实际上做什么?,delphi,Delphi,我有一个C DLL,它返回一个指向由C DLL管理的PAnsiChar字符串的指针。我想复制一个字符串,这样就可以在Delphi端管理它 如果我将返回的PAnsiChar转换为AnsiString,如“str:=AnsiString(myPAnsiChar)”中所述,那么转换实际上是做什么的?强制转换是为PAnsiChar指向的字符串分配新内存,还是我应该先从DLL复制一个字符串 是的。编译器将该转换转换为RTL例程调用,该调用将字符串复制到新的AnsiString中。如果在启用调试DCU的情况

我有一个C DLL,它返回一个指向由C DLL管理的PAnsiChar字符串的指针。我想复制一个字符串,这样就可以在Delphi端管理它


如果我将返回的PAnsiChar转换为AnsiString,如“str:=AnsiString(myPAnsiChar)”中所述,那么转换实际上是做什么的?强制转换是为PAnsiChar指向的字符串分配新内存,还是我应该先从DLL复制一个字符串

是的。编译器将该转换转换为RTL例程调用,该调用将字符串复制到新的AnsiString中。如果在启用调试DCU的情况下生成,则可以在调试器中跟踪它并查看其工作方式。例如:

var
    fromTheDll: PAnsiChar;
    localCopy: string;

localCopy := fromTheDll; //Delphi copies the string to fromTheDll variable

事实上,演员阵容是多余的。您可以同样轻松地编写str:=myPAnsiChar

Delphi字符串类型使用由RTL管理的内存。这意味着他们永远不会重用PChar的内容。您唯一需要采取步骤确保赋值创建新副本的时间是当赋值在两个匹配的Delphi字符串类型之间时。也就是说,从Anistring到Anistring或从UnicodeString到UnicodeString