Virtuelle Ordner öffnen |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
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.
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:
_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:
begin
ShowSpecialFolder(CSIDL_Desktop);
end;