Воспроизводимая ошибка с Winapi.ShlObj.SHGetFolderPath - PullRequest
0 голосов
/ 16 сентября 2018

С этим кодом я получаю 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;

enter image description here

В Delphi 10.2 Токио, если я вызываю эту функцию дважды, второй разЯ получаю AV.

Что вызывает эту ошибку?

Я использовал PWideChar, потому что Delphi IDE сказал мне так: enter image description here

1 Ответ

0 голосов
/ 16 сентября 2018

Вы не следуете протоколу, изложенному в документации. документация для последнего аргумента гласит

Указатель на завершающуюся нулем строку длины 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;
...