Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm Ordner finden (https://www.delphipraxis.net/111602-programm-ordner-finden.html)

SaFu 6. Apr 2008 13:06


Programm Ordner finden
 
Hi

Und zwar habe ich ein kleines Problem. Ich las den Benutzer über eine Groupbox sein schreib Programm wählen.

Der Pfad zum Programm ordner ändert sich ja aber immer (XP, Vista) wie kann ich jetzt den Programmpfad herausfinden immoment mache ich das so mit der abfrage des betriebsystem jetzt habe ich den Tipp bekommen das, das nicht schön gelöst ist.

Delphi-Quellcode:
sWindowsVersionName:= JvComputerInfoEx1.OS.ProductName;

Label3.Caption:= 'Verwendetes Betriebssytem: ' + Form1.sWindowsVersionName; // Windows Version anzeigen

 if Form1.sWindowsVersionName = 'Microsoft Windows 2000' then
  begin
    sWinPfad:= 'C:\Programme';
  end;

 if Form1.sWindowsVersionName = 'Microsoft Windows XP' then
  begin
    sWinPfad:= 'C:\Programme';
  end;

 if Form1.sWindowsVersionName = 'Microsoft Windows Vista' then
  begin
    sWinPfad:= 'C:\Program Files';
  end;
end;


//================Auswahl Programm==============================================
procedure TSoftwareeinstellungen.GrBoxProgrammauswahlClick(Sender: TObject);
begin
 if GrBoxProgrammauswahl.ItemIndex = 0 then
  begin
   sProgrammPfad:= (sWinpfad +'\Windows NT\Accessories\wordpad.exe');
   if not FileExists(sProgrammPfad) then
    Begin
     sProgrammPfad:= ('c:\Programme\Windows NT\Zubehör\Wordpad.exe');
    End;
   sProgramLabel:= ('Wordpad');
  end;

   if GrBoxProgrammauswahl.ItemIndex = 1 then
    begin
     if not FileExists (sWinpfad + '\OpenOffice.org 2.4\program\swriter.exe') then
      begin
       if Form1.MessageDlgPos2('OpenOffice 2.4 ist nicht Installiert.' + #10 +'Wollen Sie OpenOffice installieren?'
       + #10 + #10 + 'Nehmen Sie nach der Installation die Einstellungen nochmals vor',mtInformation,[mbYes,mbNo],self) = mrYes then
        begin
         if ShellExecute(Application.Handle,'open',PChar(sWinpfad +  '\xxxxx\Support\OOo_2.4.0rc2_20080227_Win32Intel_install_de.exe'),Nil, Nil, SW_NORMAL) <= 32 then
        end
       else
        begin
         sProgrammPfad:= (sWinpfad + '\Windows NT\Accessories\wordpad.exe');
         if not FileExists(sProgrammPfad) then
          Begin
           sProgrammPfad:= ('c:\Programme\Windows NT\Zubehör\Wordpad.exe');
          End;
         Form1.MessageDlgPos2('Standard Programm Wordpad wird ausgeführt!',mtInformation,[mbOk],self);
         sProgramLabel:= ('Wordpad');
        end;
      end

     else
      begin
       if fileExists (sWinpfad + '\OpenOffice.org 2.4\program\swriter.exe')then
        begin
         sProgrammPfad:=(sWinpfad + '\OpenOffice.org 2.4\program\swriter.exe');
         sProgramLabel:= ('OpenOffice');
        end
      end;
    end;

     if GrBoxProgrammauswahl.ItemIndex = 2 then
      begin
       if not FileExists (sWinpfad + '\Microsoft Office\Office10\WINWORD.EXE')then
        begin
          if Form1.MessageDlgPos2('Word 2003 ist nicht Installiert.',mtInformation,[mbOK],self) = mrOK then
           begin
            sProgrammPfad:= (sWinpfad + '\Windows NT\Accessories\wordpad.exe');
             if not FileExists(sProgrammPfad) then
              Begin
               sProgrammPfad:= ('c:\Programme\Windows NT\Zubehör\Wordpad.exe');
              End;
            sProgramLabel:= ('Wordpad');
            Form1.MessageDlgPos2('Standard Programm Wordpad wird ausgeführt!',mtInformation,[mbOk],self);
           end;
        end
       else
        begin
         sProgrammPfad:=(sWinpfad + '\Microsoft Office\Office10\WINWORD.EXE');
         sProgramLabel:= ('Word 2003');
        end;
       end;


    if GrBoxProgrammauswahl.ItemIndex = 3 then
     begin
      if not FileExists (sWinpfad + '\Microsoft Office\Office12\WINWORD.EXE')then
       begin
         if Form1.MessageDlgPos2('Word 2007 ist nicht Installiert.',mtInformation,[mbOK],self) = mrOk then
          begin
           sProgramLabel:= ('Wordpad');
           sProgrammPfad:= (sWinpfad + '\Windows NT\Accessories\wordpad.exe');
            if not FileExists(sProgrammPfad) then
             Begin
              sProgrammPfad:= ('c:\Programme\Windows NT\Zubehör\Wordpad.exe');
             End;
           Form1.MessageDlgPos2('Standard Programm Wordpad wird ausgeführt!',mtInformation,[mbOk],self);
          end;
       end
      else
       begin
        sProgrammPfad:=(sWinpfad + '\Microsoft Office\Office12\WINWORD.EXE');
        sProgramLabel:= ('Word 2007');
       end;
     end;
   Label4.Caption:= 'Ihr gewähltes Programm: ' + sProgramLabel;
Oder hat jemand eine schönere Lösung

Gruß Sascha

[edit=MrSpock]Änderung am Programmpfad wie vom Ersteller gewünscht durchgeführt. Mfg, MrSpock[/edit]

Der.Kaktus 6. Apr 2008 13:14

Re: Programm Ordner finden
 
hallo,

zum ProgrammfilesPath gehts hierlang--->
Delphi-Quellcode:
JvComputerInfoEx1.Folders.ProgramFiles

SirThornberry 6. Apr 2008 13:19

Re: Programm Ordner finden
 
ohne zusätzliche Komponenten geht es über SHGetSpecialFolderPath

hathor 6. Apr 2008 13:28

Re: Programm Ordner finden
 
Das Thema wurde hier schon x-mal behandelt, aber da muss man natürlich den Suchbegriff GETSPECIALFOLDER kennen.

Delphi-Quellcode:
uses
  { ... },
  ActiveX, // IMalloc
  ShellAPI, // SHGetSpecialFolderLocation() und SHGetPathFromIDList()
  ShlObj;  // CSIDL_-Konstanten

.
.
.

function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
pMalloc: IMalloc;
pidl: PItemIDList;
Path: PChar;
begin
// get IMalloc interface pointer
if (SHGetMalloc(pMalloc) <> S_OK) then
begin
MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.','SHGetMalloc(pMalloc)', 16);
Exit;
end;
// retrieve path
SHGetSpecialFolderLocation(hWindow, Folder, pidl);
GetMem(Path, MAX_PATH);
SHGetPathFromIDList(pidl, Path);
Result := Path;
FreeMem(Path);

// free memory allocated by SHGetSpecialFolderLocation
pMalloc.Free(pidl);
end;

//Mit folgendem Aufruf werden alle Specialfolder angezeigt, die auf DIESEM PC zur Verfügung stehen:
for i := 0 to 64 do Memo1.Lines.add(IntToStr(i)+' : '+ GetSpecialFolder(Form1.Handle,i));

SirThornberry 6. Apr 2008 13:31

Re: Programm Ordner finden
 
@hathor: Warum SHGetSpecialFolderLocation anstelle von SHGetSpecialFolderPath? Mit SHGetSpecialFolderPath ginge das ganze bedeutend einfacher.

Der.Kaktus 6. Apr 2008 13:38

Re: Programm Ordner finden
 
@SirThornberry & @hathor
Sascha schrieb doch im Quelltext...er wuerde JVCL Komponenten nutzen..dann eruebrigt sich das doch ..trinkt nen :cheers: *gggg*
@Sascha fuer die Suche nach installierten Programmen empfehle ich auch deshalb ..schau Dir mal die Komponente JvUninstallControls an. Da findest Du einiges.(im Quelltext gesehen..deshalb der Tip)

hathor 6. Apr 2008 13:43

Re: Programm Ordner finden
 
Zitat:

Zitat von SirThornberry
@hathor: Warum SHGetSpecialFolderLocation anstelle von SHGetSpecialFolderPath? Mit SHGetSpecialFolderPath ginge das ganze bedeutend einfacher.

The reason for using SHGetSpecialFolderLocation instead of SHGetSpecialFolderPath is that the second is only available from the version 4.71 (Internet Explorer 4) of the Shell32.dll while the first is present on all systems starting with NT 4 and Win 95.

SaFu 6. Apr 2008 14:04

Re: Programm Ordner finden
 
Zitat:

Zitat von Der.Kaktus
@SirThornberry & @hathor
Sascha schrieb doch im Quelltext...er wuerde JVCL Komponenten nutzen..dann eruebrigt sich das doch ..trinkt nen :cheers: *gggg*
@Sascha fuer die Suche nach installierten Programmen empfehle ich auch deshalb ..schau Dir mal die Komponente JvUninstallControls an. Da findest Du einiges.(im Quelltext gesehen..deshalb der Tip)

Ja mit Komponenten ist es halt einfacher ich Pruche Sie nicht unbending
die JvUninstallControls gibt es bei mir nicht aber der programmpfad mit der anderen Komponente Hilft schon viel weiter Danke

hathor 6. Apr 2008 14:17

Re: Programm Ordner finden
 
So - ich habe nun den Code "modernisiert" für "neuere" WINDOWS-Versionen.
Damit kann man alle SPECIALFOLDER bekommen: (wozu JVCL ???)

Delphi-Quellcode:
uses ...,ShlObj,...

procedure TForm1.FormShow(Sender: TObject);
var i:integer;
    Str : array[0..256] of char;
begin
Memo1.clear;
for i := 0 to 64 do
Begin
SHGetSpecialFolderPath(Application.Handle, @Str[0], i, false);
Memo1.Lines.add(IntToStr(i)+' : '+ Str);
END;
end;

SaFu 6. Apr 2008 14:29

Re: Programm Ordner finden
 
Danke für die mühe

Aber ich brauche wirklich nur den Programmordner
Das ist so kürzer

Delphi-Quellcode:
 if GrBoxProgrammauswahl.ItemIndex = 0 then
  begin
   sProgrammPfad:= LowerCase(JvComputerInfoEx2.Folders.ProgramFiles +'\Windows NT\Accessories\wordpad.exe');
   if not FileExists(sProgrammPfad) then
    Begin
     sProgrammPfad:= LowerCase(JvComputerInfoEx2.Folders.ProgramFiles + '\Windows NT\Zubehör\Wordpad.exe');
    End;
   sProgramLabel:= ('Wordpad');
  end;

hathor 6. Apr 2008 14:43

Re: Programm Ordner finden
 
Ich will Dir ja nicht zu nahe treten, aber Dein Code mag auf DEINEM PC funktionieren, auf fast allen anderen NICHT !!!

Bei meinem letzten Code-Beispiel muss man nur "i" durch die Konstante ersetzen, die in allen WINDOWS-Versionen gleich ist.

Beispiele:

const CSIDL_COMMON_APPDATA = $0023;
CSIDL_MYMUSIC = $0013;
CSIDL_MYPICTURES = $0014;
CSIDL_LOCAL = $0022;
CSIDL_SYSTEM = $0025;
CSIDL_WINDOWS = $0024;
CSIDL_PROGRAM_FILES = $0026;
CSIDL_LOCAL_APPDATA = $001C;


Im Übrigen antworte ich nicht nur speziell für Dich, sondern für alle, die hier im Forum was
Neues lernen wollen.
Ich lese auch andere Fragen und Antworten, denn:
MAN LERNT NIE AUS!

SaFu 6. Apr 2008 14:50

Re: Programm Ordner finden
 
Ok kannst du mir dann viewlleicht nochmal helfen, ist ja ein Argument

müsste es dann so aussehen

Delphi-Quellcode:
showmessage((SHGetSpecialFolderPath(Application.Handle, @Str[0], CSIDL_PROGRAM_FILES, false) +'\Windows NT\Accessories\wordpad.exe'));

Der.Kaktus 6. Apr 2008 14:54

Re: Programm Ordner finden
 
Muss mich doch nochmal zu Wort melden...Der Programmfilesordner nützt Dir aber bei der Wordpad.exe garnichts..dieses Programm befindet sich ja im Windows-Verzeichnis :gruebel:

SaFu 6. Apr 2008 14:56

Re: Programm Ordner finden
 
Das ist schon richtig so
Delphi-Quellcode:
C:\Programme\Windows NT\Zubehör
und das gebe ich ja als String noch an

ManuMF 6. Apr 2008 15:13

Re: Programm Ordner finden
 
Das Problem ist, dass dieser String bei jedem PC anders sein kann oder gar ist.

SaFu 6. Apr 2008 15:30

Re: Programm Ordner finden
 
Wie soll ich das denn am besten anstellen das die Programme überall gefunden werden

hathor 6. Apr 2008 15:31

Re: Programm Ordner finden
 
Wenn Du speziell das WordPadDir suchst, ist es besser mit folgender Funktion:

Delphi-Quellcode:
uses ..., Registry,...

function WordPadDir: string;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;

  with reg do
    try
      RootKey := HKEY_LOCAL_MACHINE;

      Result := '';

      if OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WORDPAD.EXE', False) then
        Result := ReadString('');

      Result := ExtractFilePath(Result); // leaves the trailing backslash intact
    finally
      Free;
    end;
end;

ManuMF 6. Apr 2008 15:37

Re: Programm Ordner finden
 
Ich würde noch beim Createn der Registry gleich nur Lese-Zugriff festlegen, falls die Rechte eingeschränkt sind.

SaFu 6. Apr 2008 15:42

Re: Programm Ordner finden
 
Ok beim WordPad geht das aber wie sieht es mit Word aus da kann ich ja 2 Versichdene Versionen Installiert haben z.b. 2003 und 2007

und das selbe bei OpenOffice

Fragen über fragen langsam habe ich das gefühl das ich da ein rießen sch.... programmiert habe :oops:

s-off 6. Apr 2008 16:19

Re: Programm Ordner finden
 
Hallo,

da das Suchen nach irgendwelchen Exe-Dateien irgendwelcher Anwendungen sehr dynamisch ist, wirst Du ohne sehr großen Aufwand und Detailwissen um die einzelnen Anwendungen nur schwerlich zu einem, vor allem vollständigen, Ergebnis kommen.

Da sicherlich 98% der Anwender ihre Programme über Verknüpfungen starten, würde ich diesen anbieten, die entsprechende Verknüpfung zum Programm ihrer Wahl auszuwählen. Dazu liest Du die Verknüpfungen aus Quickstart, Desktop und Startmenü aus (wie Du diese Pfade bekommst, weißt Du ja nun), und listest diese auf. Anschließend liest Du den Pfad zur Anwendung aus der gewählten Verknüpfung aus.

Für die restlichen 2% und fortgeschrittene Anwender kannst Du auch die Möglichkeit zur direkten Auswahl der Exe-Datei anbieten.

Luckie 6. Apr 2008 17:00

Re: Programm Ordner finden
 
Zitat:

Zitat von hathor
Zitat:

Zitat von SirThornberry
@hathor: Warum SHGetSpecialFolderLocation anstelle von SHGetSpecialFolderPath? Mit SHGetSpecialFolderPath ginge das ganze bedeutend einfacher.

The reason for using SHGetSpecialFolderLocation instead of SHGetSpecialFolderPath is that the second is only available from the version 4.71 (Internet Explorer 4) of the Shell32.dll while the first is present on all systems starting with NT 4 and Win 95.

Und im SDK steht:
Zitat:

With Microsoft Windows 2000, this function is superseded by ShGetFolderPath. You can use this function on earlier systems by including the redistributable DLL, ShFolder.dll.
Ergo ist es besser MSDN-Library durchsuchenSHGetFolderPath zu benutzen. Ein Support von Windows 95 und Windows NT 4 ist nun wirklich nicht mehr von Nöten.

Luckie 6. Apr 2008 17:23

Re: Programm Ordner finden
 
Ich habe das mal eben implementiert:
Delphi-Quellcode:
function SHGetFolderPathW(hwndOwner: HWND; nFolder: Integer; hToken: THandle; dwFlags: DWORD; pszPath: LPWSTR):
  HRESULT; stdcall; external 'shell32.dll' name 'SHGetFolderPathW';

const
  SHGFP_TYPE_CURRENT = 0;

const
  CSIDL_FLAG_CREATE = $8000;
  CSIDL_ADMINTOOLS = $0030;
  CSIDL_ALTSTARTUP = $001D;
  CSIDL_APPDATA    = $001A;
  CSIDL_BITBUCKET  = $000A;
  CSIDL_CDBURN_AREA = $003B;
  CSIDL_COMMON_ADMINTOOLS = $002F;
  CSIDL_COMMON_ALTSTARTUP = $001E;
  CSIDL_COMMON_APPDATA = $0023;
  CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
  CSIDL_COMMON_DOCUMENTS = $002E;
  CSIDL_COMMON_FAVORITES = $001F;
  CSIDL_COMMON_MUSIC = $0035;
  CSIDL_COMMON_PICTURES = $0036;
  CSIDL_COMMON_PROGRAMS = $0017;
  CSIDL_COMMON_STARTMENU = $0016;
  CSIDL_COMMON_STARTUP = $0018;
  CSIDL_COMMON_TEMPLATES = $002D;
  CSIDL_COMMON_VIDEO = $0037;
  CSIDL_CONTROLS   = $0003;
  CSIDL_COOKIES    = $0021;
  CSIDL_DESKTOP    = $0000;
  CSIDL_DESKTOPDIRECTORY = $0010;
  CSIDL_DRIVES     = $0011;
  CSIDL_FAVORITES  = $0006;
  CSIDL_FONTS      = $0014;
  CSIDL_HISTORY    = $0022;
  CSIDL_INTERNET   = $0001;
  CSIDL_INTERNET_CACHE = $0020;
  CSIDL_LOCAL_APPDATA = $001C;
  CSIDL_MYDOCUMENTS = $000C;
  CSIDL_MYMUSIC    = $000D;
  CSIDL_MYPICTURES = $0027;
  CSIDL_MYVIDEO    = $000E;
  CSIDL_NETHOOD    = $0013;
  CSIDL_NETWORK    = $0012;
  CSIDL_PERSONAL   = $0005;
  CSIDL_PRINTERS   = $0004;
  CSIDL_PRINTHOOD  = $001B;
  CSIDL_PROFILE    = $0028;
  CSIDL_PROFILES   = $003E;
  CSIDL_PROGRAM_FILES = $0026;
  CSIDL_PROGRAM_FILES_COMMON = $002B;
  CSIDL_PROGRAMS   = $0002;
  CSIDL_RECENT     = $0008;
  CSIDL_SENDTO     = $0009;
  CSIDL_STARTMENU  = $000B;
  CSIDL_STARTUP    = $0007;
  CSIDL_SYSTEM     = $0025;
  CSIDL_TEMPLATES  = $0015;
  CSIDL_WINDOWS    = $0024;

function GetSpecialFolder(HandleOwner: THandle; Folder: Integer): WideString;
var
  Res              : HRESULT;
  Buffer           : array[0..MAX_PATH - 1] of WCHAR;
begin
  Result := '';
  Res := SHGetFolderPathW(HandleOwner, Folder, 0, SHGFP_TYPE_CURRENT, Buffer);
  if Res = S_OK then
  begin
    Result := WideString(Buffer);
  end;
end;
Gibt es auch als Ansi-Version, aber ich denke, man sollte schon frühzeitig Unicode unterstützen - es kann ja nichts schaden. ;)

s-off 6. Apr 2008 18:13

Re: Programm Ordner finden
 
[OT]
Zitat:

Zitat von Luckie
Ein Support von Windows 95 und Windows NT 4 ist nun wirklich nicht mehr von Nöten.

Da gebe ich Dir recht, erinnert mich aber daran, dass einer unserer Kunden noch bis vor einem knappen Jahr mit Windows 3.11 gearbeitet hat :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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