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;