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