AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Pfad der "Special Folders" ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Pfad der "Special Folders" ermitteln

Ein Thema von HannosG · begonnen am 24. Nov 2007 · letzter Beitrag vom 30. Nov 2007
Antwort Antwort
Benutzerbild von HannosG
HannosG

Registriert seit: 2. Jul 2006
42 Beiträge
 
Delphi 2010 Professional
 
#1

Pfad der "Special Folders" ermitteln

  Alt 24. Nov 2007, 14:54
Moin,

d3g beschreibt in Pfad der "Special Folders" ermitteln, wie man über "CSIDL-Konstanten" zu den dazugehörigen Pfadangaben gelangt (z.B. Pfad des Programme-Ordners herausfinden):

Delphi-Quellcode:
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;
Warum wird dazu so gut wie immer SHGetSpecialFolderLocation benutzt?
Wozu gibt es denn SHGetSpecialFolderPath?
Damit wickelt man die Funktion doch in einem Zweizeiler ab:

Delphi-Quellcode:
uses ShlObj;

...

function GetSpecialFolder(Folder: Integer): PChar;
begin
  Result:=StrAlloc(MAX_PATH);
  SHGetSpecialFolderPath(0, Result, Folder, false);
end;
MfG,
HannosG
Hanno Günther
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

Re: Pfad der "Special Folders" ermitteln

  Alt 24. Nov 2007, 15:22
SHGetSpecialFolderLocation ist älter. Ich hab ein Buch der API32 von 1998 und da ist SHGetSpecialFolderPath nicht drin.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Pfad der "Special Folders" ermitteln

  Alt 24. Nov 2007, 15:26
Zitat von MSDN zu SHGetSpecialFolderPath:
Minimum operating systems Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0
Allerdings würde ich die kapselnde Funktion anders schreiben. So kriegt man einfach zu leicht ein Speicherleck. Besser wäre es, die Funktion einen String zurückgeben zu lassen und den PChar als lokale Variable wieder freizugeben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

Re: Pfad der "Special Folders" ermitteln

  Alt 24. Nov 2007, 15:41
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;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Pfad der "Special Folders" ermitteln

  Alt 24. Nov 2007, 15:43
Du gibst weder pidl noch Path frei!
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von HannosG
HannosG

Registriert seit: 2. Jul 2006
42 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Pfad der "Special Folders" ermitteln

  Alt 24. Nov 2007, 17:08
@Popov
Kürzer hinbekommen ist kein Problem, nur hat das mit dem "IMalloc" und dem Freigeben schon seinen Sinn.
3. IMalloc, SHGetMalloc() Pfad der "Special Folders" ermitteln

Die Funktion SHGetSpecialFolderPath belegt eben keinen Speicher für eine "ItemIDList".

@Apollonius
Zitat von Apollonius:
Allerdings würde ich die kapselnde Funktion anders schreiben. So kriegt man einfach zu leicht ein Speicherleck. Besser wäre es, die Funktion einen String zurückgeben zu lassen und den PChar als lokale Variable wieder freizugeben.
Da muss ich dir zustimmen.
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;
Hanno Günther
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Pfad der "Special Folders" ermitteln

  Alt 24. Nov 2007, 18:10
Zitat von HannosG:
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;
muss sie doch gar nicht

Delphi-Quellcode:
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;
Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#8

Re: Pfad der "Special Folders" ermitteln

  Alt 30. Nov 2007, 10:35
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von HannosG
HannosG

Registriert seit: 2. Jul 2006
42 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Pfad der "Special Folders" ermitteln

  Alt 30. Nov 2007, 15:47
@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:
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;
Hmmm, irgendwie finde ich die Variante von thkerkmann noch am übersichtlichsten.
Hanno Günther
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Pfad der "Special Folders" ermitteln

  Alt 30. Nov 2007, 17:43
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.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz