AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"C:\Programme" ermitteln?

Ein Thema von ichbins · begonnen am 26. Nov 2005 · letzter Beitrag vom 28. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#1

"C:\Programme" ermitteln?

  Alt 26. Nov 2005, 14:58
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?
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: "C:\Programme" ermitteln?

  Alt 26. Nov 2005, 15:35
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;
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#3

Re: "C:\Programme" ermitteln?

  Alt 26. Nov 2005, 15:44
aber unter Win98 kommt da nur ein leerer String raus.
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: "C:\Programme" ermitteln?

  Alt 26. Nov 2005, 15:53
Und was gibt GetEnvironmentVariable('ProgramFiles') aus?

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#5

Re: "C:\Programme" ermitteln?

  Alt 26. Nov 2005, 16:31
Zitat von faux:
Und was gibt GetEnvironmentVariable('ProgramFiles') aus?
  ''; ;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#6

Re: "C:\Programme" ermitteln?

  Alt 28. Nov 2005, 17:31
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;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#7

Re: "C:\Programme" ermitteln?

  Alt 28. Nov 2005, 19:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: "C:\Programme" ermitteln?

  Alt 28. Nov 2005, 19:49
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
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: "C:\Programme" ermitteln?

  Alt 28. Nov 2005, 19:52
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: "C:\Programme" ermitteln?

  Alt 28. Nov 2005, 20:01
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
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz