![]() |
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:
Oder hat jemand eine schönere Lösung
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; Gruß Sascha [edit=MrSpock]Änderung am Programmpfad wie vom Ersteller gewünscht durchgeführt. Mfg, MrSpock[/edit] |
Re: Programm Ordner finden
hallo,
zum ProgrammfilesPath gehts hierlang--->
Delphi-Quellcode:
JvComputerInfoEx1.Folders.ProgramFiles
|
Re: Programm Ordner finden
ohne zusätzliche Komponenten geht es über SHGetSpecialFolderPath
|
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)); |
Re: Programm Ordner finden
@hathor: Warum SHGetSpecialFolderLocation anstelle von SHGetSpecialFolderPath? Mit SHGetSpecialFolderPath ginge das ganze bedeutend einfacher.
|
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) |
Re: Programm Ordner finden
Zitat:
|
Re: Programm Ordner finden
Zitat:
die JvUninstallControls gibt es bei mir nicht aber der programmpfad mit der anderen Komponente Hilft schon viel weiter Danke |
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; |
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; |
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! |
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'));
|
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:
|
Re: Programm Ordner finden
Das ist schon richtig so
Delphi-Quellcode:
und das gebe ich ja als String noch an
C:\Programme\Windows NT\Zubehör
|
Re: Programm Ordner finden
Das Problem ist, dass dieser String bei jedem PC anders sein kann oder gar ist.
|
Re: Programm Ordner finden
Wie soll ich das denn am besten anstellen das die Programme überall gefunden werden
|
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; |
Re: Programm Ordner finden
Ich würde noch beim Createn der Registry gleich nur Lese-Zugriff festlegen, falls die Rechte eingeschränkt sind.
|
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: |
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. |
Re: Programm Ordner finden
Zitat:
Zitat:
![]() |
Re: Programm Ordner finden
Ich habe das mal eben implementiert:
Delphi-Quellcode:
Gibt es auch als Ansi-Version, aber ich denke, man sollte schon frühzeitig Unicode unterstützen - es kann ja nichts schaden. ;)
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; |
Re: Programm Ordner finden
[OT]
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 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 by Thomas Breitkreuz