Da ja die
API-Funktion
SHGetSpecialFolderLocation veraltet ist und man stattdessen
SHgetFolderLocation benutzen sollte, versuche ich gerade meinen Code, um die Pfade zu Systemordner zu ermitteln zu überarbeiten:
Delphi-Quellcode:
uses
Windows, SysUtils, shlobj,
ActiveX;
function SHGetFolderLocation (hwndOwnder: THandle; nFolder: Integer; hToken: THandle; dwReserved: DWORD; ppidl:
PItemIdList): HRESULT;
stdcall;
external '
shell32.dll'
name '
SHGetFolderLocation';
function SHGetPathFromIDListW(Pidl: PItemIDList; pszPath: PWideChar): BOOL;
stdcall;
external '
shell32.dll'
name '
SHGetPathFromIDListW';
function PathFromIDList(Pidl: PItemIdList): WideString;
begin
SetLength(Result, MAX_PATH);
if not SHGetPathFromIDListW(Pidl, PWideChar(Result))
then
raise Exception.Create('
Odner kann nicht ermittelt werden');
end;
function GetShellFolder(CSIDL: Integer): WideString;
var
ppidl: PItemIdList;
begin
ppidl := CoTaskMemAlloc(0);
try
case SHGetFolderLocation(0, CSIDL, 0, 0, ppidl)
of
S_OK: Result := PathFromIDList(ppidl);
S_FALSE:
raise Exception.Create('
Ordner existiert nicht');
E_INVALIDARG:
raise Exception.Create('
Argument ungültig');
end;
finally
CoTaskMemFree(ppidl);
end;
end;
begin
try
Writeln(GetShellFolder(CSIDL_LOCAL_APPDATA));
except
on E:
Exception do
Writeln(E.
Message);
end;
Readln;
end.
Leider steigt er beim Aufruf von SHGetPathFromIDListW mit einer
Access Violation in der shell32.dll aus, obwohl der Übergabeparamter gültig ist.
Was mache ich da noch falsch?