Home » Tipps & Tricks » Dateien/Verzeichnisse » Verzeichnisse » Virtuelle Ordner öffnen

Virtuelle Ordner öffnen

Unter Windows gibt es einige spezielle Ordner, wie z.B. die ‚Netzwerkumgebung‘ oder den Ordner ‚Eigene Dateien‘. Folgender Artikel zeigt, wie man einen solchen Ordner öffnet bzw. den Pfad eines solchen Ordners ermittelt.

uses
ShlObj, ActiveX, ShellApi;

procedure ShowSpecialFolder(const AFolder: Integer);
var
  ItemIDList: PItemIDList;
  ShExInfo: ShellExecuteInfo;
  ShellH: IMalloc;
begin
  if SUCCEEDED(ShGetSpecialFolderLocation(Application.Handle, AFolder, ItemIDList)) then
  begin
    try
      FillChar(ShExInfo, SizeOf(ShExInfo), 0);
      with ShExInfo do
      begin
        cbSize := SizeOf(ShExInfo);
        nShow := SW_SHOW;
        fMask := SEE_MASK_IDLIST;
        lpIDList := ItemIDList;
      end;
      ShellExecuteEx(@ShExInfo);
    finally
      if SHGetMalloc(ShellH) = NOERROR then
        ShellH.Free(ItemIDList);
    end;
  end
  else
    RaiseLastOSError;
end;

RaiseLastOSError ist erst ab Delphi 6 verfügbar. Programmierer, die mit älteren Versionen arbeiten müssen an dieser Stelle RaiseLastWin32Error verwenden. Des Weiteren ist die Struktur des Typs ‚ShellExecuteInfo‘ in älteren Delphi-Versionen nicht vorhanden. Sie muss nachträglich definiert werden:

type
_SHELLEXECUTEINFOA = record
  cbSize: DWORD;
  fMask: ULONG;
  Wnd: HWND;
  lpVerb: PAnsiChar;
  lpFile: PAnsiChar;
  lpParameters: PAnsiChar;
  lpDirectory: PAnsiChar;
  nShow: Integer;
  hInstApp: HINST;
  { Optional fields }
  lpIDList: Pointer;
  lpClass: PAnsiChar;
  hkeyClass: HKEY;
  dwHotKey: DWORD;
  hIcon: THandle;
  hProcess: THandle;
end;

ShellExecuteInfo = _SHELLEXECUTEINFOA;

Als Parameter muss die Konstante für den Ordner übergeben werden. Diese könnten z.B. so aussehen:

  • CSIDL_Desktop für Desktop,
  • CSIDL_Controls für Systemsteuerung,
  • CSIDL_Printers für Drucker,
  • CSIDL_Personal für Eigene Dateien,
  • CSIDL_Drives für Arbeitsplatz,
  • CSIDL_Network für Netzwerkumgebung.

Weitere Konstanten stehen in der Unit ShlObj bzw in der PSDk unter dem Stichwort ‚SHGetSpecialFolderLocation [Now Supported on Windows NT]‘.

Die Procedure kann folgendermaßen aufgerufen werden:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowSpecialFolder(CSIDL_Desktop);
end;