Winapi.ShlObj.SHGetFolderPath可重现的错误

use*_*348 -1 delphi winapi delphi-10.1-berlin delphi-10.2-tokyo

使用此代码我得到一个AV:

uses
  Winapi.ShlObj;

function GetUserAppDataPath: string;
var
  ThisPath: PWideChar;
begin
  if Winapi.ShlObj.SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, ThisPath) = S_OK then
    Result := string(ThisPath)
  else
    Result := '';
end;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在Delphi 10.2 Tokyo中,如果我两次调用此函数,第二次获得AV.

是什么导致这个错误?

我曾经PWideChar因为德尔福IDE的告诉我的: 在此输入图像描述

Dav*_*nan 6

您没有遵循文档中规定的协议.最后一个论点的文档

指向以null结尾的长度为MAX_PATH的字符串的指针,该字符串将接收路径.

您需要分配该缓冲区并传递其地址.

function GetUserAppDataPath: string;
var
  ThisPath: array[0..MAX_PATH-1] of Char;
begin
  if Winapi.ShlObj.SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, ThisPath) = S_OK then
    Result := ThisPath
  else
    Result := '';
end;
Run Code Online (Sandbox Code Playgroud)

  • 术语*"length"*通常用于描述字符数,不包括空终止符.术语*"size"*通常用于表示缓冲区的大小(以字节为单位),包括空终止符.虽然MSDN在使用这些术语时并不一致,但我也可能会安全地使用它. (2认同)