![]() |
Pfad der "Special Folders" ermitteln
Moin,
d3g beschreibt in ![]()
Delphi-Quellcode:
Warum wird dazu so gut wie immer
uses ActiveX, ShellApi, ShlObj;
... function GetSpecialFolder(hWindow: HWND; Folder: Integer): String; // z.B. Folder: CSIDL_PROGRAM_FILES = $26 = 38 var pMalloc: IMalloc; pidl: PItemIDList; Path: PChar; begin // get IMalloc interface pointer if (SHGetMalloc(pMalloc) <> S_OK) then begin MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.', 'SHGetMalloc(pMalloc)', 16); Exit; end; // retrieve path SHGetSpecialFolderLocation(hWindow, Folder, pidl); GetMem(Path, MAX_PATH); SHGetPathFromIDList(pidl, Path); Result := Path; FreeMem(Path); // free memory allocated by SHGetSpecialFolderLocation pMalloc.Free(pidl); end; ![]() Wozu gibt es denn ![]() Damit wickelt man die Funktion doch in einem Zweizeiler ab:
Delphi-Quellcode:
MfG,
uses ShlObj;
... function GetSpecialFolder(Folder: Integer): PChar; begin Result:=StrAlloc(MAX_PATH); SHGetSpecialFolderPath(0, Result, Folder, false); end; HannosG |
Re: Pfad der "Special Folders" ermitteln
SHGetSpecialFolderLocation ist älter. Ich hab ein Buch der API32 von 1998 und da ist SHGetSpecialFolderPath nicht drin.
|
Re: Pfad der "Special Folders" ermitteln
Zitat:
|
Re: Pfad der "Special Folders" ermitteln
Allerdings kriegt man das auch kürzer mit SHGetSpecialFolderLocation als oben
Delphi-Quellcode:
function SpecialDirectory(ID: Integer): String; // uses Windows, Shlobj;
var pidl : PItemIDList; Path : PChar; begin if SUCCEEDED(SHGetSpecialFolderLocation(0, ID, pidl)) then begin Path := StrAlloc(max_path); SHGetPathFromIDList(pidl, Path); Result := String(Path); end else Result := #0; end; |
Re: Pfad der "Special Folders" ermitteln
Du gibst weder pidl noch Path frei!
|
Re: Pfad der "Special Folders" ermitteln
@Popov
Kürzer hinbekommen ist kein Problem, nur hat das mit dem "IMalloc" und dem Freigeben schon seinen Sinn. 3. IMalloc, SHGetMalloc() ![]() Die Funktion SHGetSpecialFolderPath belegt eben keinen Speicher für eine "ItemIDList". @Apollonius Zitat:
OK, die Funktion beginnt zu wachsen. :|
Delphi-Quellcode:
function GetSpecialFolder(Folder: Integer): String;
var Path: PChar; begin GetMem(Path,MAX_PATH); If SHGetSpecialFolderPath(0, Path, Folder, false) then Result:=Path else Result:=''; FreeMem(Path); end; |
Re: Pfad der "Special Folders" ermitteln
Zitat:
Delphi-Quellcode:
Gruss
function GetSpecialFolder(Folder: Integer): String;
var Path: array[0..MAX_PATH] of char; begin If SHGetSpecialFolderPath(0, @Path, Folder, false) then Result:=Path else Result:=''; end; |
Re: Pfad der "Special Folders" ermitteln
Ich hab da auch noch eine Version:
Delphi-Quellcode:
function GetSpecialFolder(Folder: Integer): String;
begin SetLength(Result,MAX_PATH); SHGetSpecialFolderPath(0, PChar(Result), Folder, false); SetLength(Result,StrLen(PChar(Result))); end; |
Re: Pfad der "Special Folders" ermitteln
@DeddyH
Gut, das ist diesmal glaube ich die richtige Form der Direktübergabe. Aber... SHGetSpecialFolderPath kann auch fehlschlagen und GetSpecialFolder könnte dann irgendein Wert ausgeben, mit dem man nichts zu tun haben möchte. :) Daher:
Delphi-Quellcode:
Hmmm, irgendwie finde ich die Variante von thkerkmann noch am übersichtlichsten.
function GetSpecialFolder(Folder: Integer): String;
begin SetLength(Result,MAX_PATH); If SHGetSpecialFolderPath(0, PChar(Result), Folder, false) then SetLength(Result,StrLen(PChar(Result))) else Result:=''; end; |
Re: Pfad der "Special Folders" ermitteln
UNC-Pfade können übrigens über 30.000 Zeichen lang werden. Das sollte man bei der Benutzung von MAX_PATH immer im Hinterkopf haben... nicht umsonst bieten die meisten APIs die einen Puffer erwarten die Möglichkeit, sich erst einmal die benötigte Puffergröße geben zu lassen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 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 by Thomas Breitkreuz