![]() |
"C:\Programme" ermitteln?
Hallo,
wie kann ich den Systempfad C:\Programme ermitteln bzw. wie er jetzt in Wirklichkeit heisst? Unter XP ist das kein Problem mit der GetShellFolder-Funktion: ich brauch nur 38 einzusetzen.
Delphi-Quellcode:
, aber unter Win98 gibt es nur eine sehr begrenzte Anzahl an solchen CSIDLs:
function GetShellFolder(CSIDL: integer): string;
var pidl : PItemIdList; FolderPath : string; SystemFolder : Integer; Malloc : IMalloc; begin Malloc := nil; FolderPath := ''; SHGetMalloc(Malloc); if Malloc = nil then begin Result := FolderPath; Exit; end; try SystemFolder := CSIDL; if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then begin SetLength(FolderPath, max_path); if SHGetPathFromIDList(pidl, PChar(FolderPath)) then begin SetLength(FolderPath, length(PChar(FolderPath))); end; end; Result := FolderPath; finally Malloc.Free(pidl); end; end;
Code:
wie kann ich auch dort C:\Programme erhalten?
CSIDL 000: C:\WINDOWS\Desktop
CSIDL 002: C:\WINDOWS\Startmenü\Programme CSIDL 005: C:\Eigene Dateien CSIDL 006: C:\WINDOWS\Favoriten CSIDL 007: C:\WINDOWS\Startmenü\Programme\Autostart CSIDL 008: C:\WINDOWS\Recent CSIDL 009: C:\WINDOWS\SendTo CSIDL 011: C:\WINDOWS\Startmenü CSIDL 016: C:\WINDOWS\Desktop CSIDL 019: C:\WINDOWS\Netzwerkumgebung CSIDL 020: C:\WINDOWS\FONTS CSIDL 021: C:\WINDOWS\ShellNew CSIDL 026: C:\WINDOWS\Anwendungsdaten CSIDL 032: C:\WINDOWS\Temporary Internet Files CSIDL 033: C:\WINDOWS\Cookies CSIDL 034: C:\WINDOWS\Verlauf |
Re: "C:\Programme" ermitteln?
Probiers mal damit:
Delphi-Quellcode:
uses ShlObj, ActiveX, SHFolder;
function GetProgramPath: string; const CSIDL_PROGRAM_FILES = $26; var p: PItemIDLIst; Buf: array [0..MAX_PATH-1] of Char; ShellH: IMalloc; begin if SHGetSpecialFolderLocation(Application.Handle, CSIDL_PROGRAM_FILES, p) = NOERROR then try if SHGetPathFromIDList(p, Buf) then Result := Buf; finally if SHGetMalloc(ShellH) = NOERROR then ShellH.Free(P); end; end; |
Re: "C:\Programme" ermitteln?
aber unter Win98 kommt da nur ein leerer String raus.
|
Re: "C:\Programme" ermitteln?
Und was gibt GetEnvironmentVariable('ProgramFiles') aus?
Grüße Faux |
Re: "C:\Programme" ermitteln?
Zitat:
Delphi-Quellcode:
:wall:;
'';
|
Re: "C:\Programme" ermitteln?
Jetzt bin ich gerade in meiner Virtual Machine selbst auf die Lösung gestoßen:
Code:
oder
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Programfilesdir
Code:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Programfilespath
welche Lösung ist die bessere oder sind die gleichwertig? [edit]: hat sich auch erledigt. Unter XP ist programfilespath nur "%Programfiles%". [edit2] ... wodurch man dann zu folgender Funktion kommt:
Delphi-Quellcode:
uses [...], registry; [...] function getprogramfilesdir:string; var r:tregistry; begin r:=tregistry.Create(key_read); try begin r.RootKey:=HKEY_LOCAL_MACHINE; r.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion',false); result:=r.ReadString('ProgramFilesDir'); end except end; r.free; end; |
Re: "C:\Programme" ermitteln?
Zitat:
|
Re: "C:\Programme" ermitteln?
Zitat:
Grüße Faux |
Re: "C:\Programme" ermitteln?
Das mag ja schon sein, dass die API Funktion den Pfad auch nur aus der Rehiusty liest, aber wenn MS etwas an der Registry ändert kannst du sicher sein, dass MS auch die API Funktion anpassen wird.
|
Re: "C:\Programme" ermitteln?
Zitat:
Grüße Faux |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 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-2025 by Thomas Breitkreuz