Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi "C:\Programme" ermitteln? (https://www.delphipraxis.net/57773-c-%5Cprogramme-ermitteln.html)

ichbins 26. Nov 2005 13:58


"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:
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;
, aber unter Win98 gibt es nur eine sehr begrenzte Anzahl an solchen CSIDLs:
Code:
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
wie kann ich auch dort C:\Programme erhalten?

3_of_8 26. Nov 2005 14:35

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;

ichbins 26. Nov 2005 14:44

Re: "C:\Programme" ermitteln?
 
aber unter Win98 kommt da nur ein leerer String raus.

faux 26. Nov 2005 14:53

Re: "C:\Programme" ermitteln?
 
Und was gibt GetEnvironmentVariable('ProgramFiles') aus?

Grüße
Faux

ichbins 26. Nov 2005 15:31

Re: "C:\Programme" ermitteln?
 
Zitat:

Zitat von faux
Und was gibt GetEnvironmentVariable('ProgramFiles') aus?

Delphi-Quellcode:
  '';
:wall:;

ichbins 28. Nov 2005 16:31

Re: "C:\Programme" ermitteln?
 
Jetzt bin ich gerade in meiner Virtual Machine selbst auf die Lösung gestoßen:

Code:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Programfilesdir
oder

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;

MathiasSimmack 28. Nov 2005 18:46

Re: "C:\Programme" ermitteln?
 
Zitat:

Zitat von ichbins
aber unter Win98 kommt da nur ein leerer String raus.

Sorry, aber das stimmt nicht. Ich habe selbst eine ähnliche Funktion wie deine im ersten Beitrag unter Windows 98 benutzt, und ich bekam bei jeder den gewünschten Pfad. Vom Auslesen des Pfades per Umgebungsvariable oder per Registry halte ich nichts. Wie du ja selbst siehst, klappt das nicht unbedingt.

faux 28. Nov 2005 18:49

Re: "C:\Programme" ermitteln?
 
Zitat:

Zitat von MathiasSimmack
Vom Auslesen des Pfades per Umgebungsvariable oder per Registry halte ich nichts. Wie du ja selbst siehst, klappt das nicht unbedingt.

ABer im Endeffekt muss der Pfad, der dir hier zurückgegeben wird, ja auch wieder wo gespeichert sein. Und ich denke mal, das ist dann doch in der Registry, oder? :?

Grüße
Faux

Luckie 28. Nov 2005 18:52

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.

faux 28. Nov 2005 19:01

Re: "C:\Programme" ermitteln?
 
Zitat:

Zitat von Luckie
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.

OK, das ist ein gutes Argument. Das hab ich nicht bedacht. ;)

Grüße
Faux


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 Uhr.
Seite 1 von 2  1 2      

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