![]() |
SHGetFolderLocation
Da ja die API-Funktion
![]() ![]()
Delphi-Quellcode:
Leider steigt er beim Aufruf von SHGetPathFromIDListW mit einer Access Violation in der shell32.dll aus, obwohl der Übergabeparamter gültig ist.
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. Was mache ich da noch falsch? |
Re: SHGetFolderLocation
Das ist es nicht, aber sollte nicht immer MAX_PATH + 1 reserviert werden?
|
Re: SHGetFolderLocation
Wahrscheinlich müsste es sogar (MAX_PATH * 2) + 2 heißen, da ich die Unicode Version nutze.
|
Re: SHGetFolderLocation
Zitat:
Ansonsten hab ich den Fehler gefunden ( ![]() Zitat:
|
Re: SHGetFolderLocation
Zitat:
|
Re: SHGetFolderLocation
Wenn ich sage, daß wir selbst schuld sind, weil wir die Doku nicht aufmerksam gelesen haben, dann bekomm ich haue, oder? ;)
|
Re: SHGetFolderLocation
Nur ein Problem bleibt noch: Wie bekomme ich die Fragezeichen (in der Konsole) weg?
C:\Dokumente und Einstellungen\Michael\Lokale Einstellungen\Anwendungsdaten'#0'몭몭몭몭몭몭몭몭 몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭 몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭 몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭몭 몭몭몭몭몭몭몭몭몭' Mit trim funktioniert es nicht. Und die Funktion ![]() Gelesen habe ich sie, nur dachte ich PItemIdList wäre schon der Zeiger wegen des "P"s. |
Re: SHGetFolderLocation
Delphi-Quellcode:
Wahrscheinlich wird beim SetLength nicht mit 0 initialisiert, was dafür sorgt, daß das abschließende 0-Byte fehlt. GetMem dagegen initialisiert mit 0.
function PathFromIDList(Pidl: PItemIdList): WideString;
const NTFS_MAX_PATH = 32767; var Path : PWideChar; begin GetMem(Path, (NTFS_MAX_PATH + 1) * 2); if not SHGetPathFromIDListW(Pidl, Path) then begin FreeMem(Path); raise Exception.Create('Odner kann nicht ermittelt werden'); end; Result := WideString(Path); FreeMem(Path); end; Zitat:
|
Re: SHGetFolderLocation
Jupp, so geht es:
Delphi-Quellcode:
Ich habe noch den Ressourcenschutzblock ergänzt.
function PathFromIDList(Pidl: PItemIdList): WideString;
const NTFS_MAX_PATH = 32767; var Path: PWideChar; begin GetMem(Path, (NTFS_MAX_PATH + 1) * 2); try if not SHGetPathFromIDListW(Pidl, Path) then begin FreeMem(Path); raise Exception.Create(rsE_GetPathFromIDList); end; Result := WideString(Path); finally FreeMem(Path); end; end; Zitat:
|
Re: SHGetFolderLocation
Zitat:
Zitat:
Noch ein kleiner Hinweis: Entfern das "ppidl := CoTaskMemAlloc(0);" noch aus dem Code. Ist nicht wirklich notwendig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz