Winapi.ShlObj.SHGetFolderPath 的可重现错误

Reproducible error with Winapi.ShlObj.SHGetFolderPath

使用这段代码我得到了一个 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;

在Delphi10.2 Tokyo中,如果我调用这个函数两次,第二次我就得到了一个AV。

导致此错误的原因是什么?

我使用 PWideChar 因为 Delphi IDE 告诉我:

您没有遵守文档规定的协议。最后一个参数的 documentation 表示

A pointer to a null-terminated string of length MAX_PATH which will receive the 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;