![]() |
Externes Programm starten
Hallo,
ich habe mir aus der CodeLibrary den Code geholt um zu überprüfen, ob ein bestimmtes Programm auf den Rechner installiert ist. Hier sonst nochmal der Code
Code:
function ProgIDExists(const ProgID: WideString): Boolean;
var Tmp: TGUID; begin Result := Succeeded(CLSIDFromProgID(PWideChar(ProgID), Tmp)); end; So, nun wollte ich gerne eine "Kommandozentrale" basteln, aus der man die Programme von MS Office starten kann. Dazu wird erst überprüft, ob das Programm installiert ist und dann soll es automatisch gestartet werden, falls das Programm installiert ist. Wie kann ich jetzt dieses automatische Starten realisieren? Wäre super, wenn mir jemand helfen könnte. |
Re: Externes Programm starten
Suche mal nach "shellexecute"
Oder wenn du die Ausführung des Programmes überwachen willst, ist "CreateProcess" wahrscheinlich besser. |
Re: Externes Programm starten
Gibt es denn auch die Möglichkeit abzufragen, wo das Programm installiert ist. Es hat ja nicht jeder Office im selben Ordner installiert und wenn ich dann versuche statisch das Programm aufzurufen, dann kann das ja auch in die Hose gehen, obwohl Office installiert wurde.
|
Re: Externes Programm starten
Zitat:
dort steht ja, wo genau der User z.B. seine Office installiert hat. Natürlich müsstest du dich vorher um die Bezeichnungen der Registry-Äste / Schlüssel kümmern. Aber das steht sicher auf der MS-Homepage. Gruß Pfoto |
Re: Externes Programm starten
Danke, aber ich glaube, dann ist doch ein wenig zu extrem für mich als kleinen Hobbyprogrammierer. Na ja, ne Abfrage, ob das Programm installiert ist hat ja auch was...
|
Re: Externes Programm starten
Die Programm starten sollte auch ohne Pfadangaben gehen.
Wenn ich in der Console WinWord eingeben, startet auch Word. Grüße Klaus |
Re: Externes Programm starten
Wie meinst du das? In welche Konsole gibst du das denn ein?
Kann mir jemand sagen, wie ich ein Programm mit CreateProcess starten kann und was ich alles einbinden muss? Danke.. |
Re: Externes Programm starten
|
Re: Externes Programm starten
Zitat:
Grüße Klaus |
Re: Externes Programm starten
Super.
Nur wie bekomme ich jetzt den Pfad zu zum Beispiel Word? Ich wollte ja nicht gerade statisch arbeitet, sondern dynamisch... @Klaus Das klappt bei mir leider nicht... |
Re: Externes Programm starten
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Grüße Klaus |
Re: Externes Programm starten
Nun ist aber die Frage, was passiert, wenn ich eine ältere Version habe?
Die soll dann ja auch erkannt werden? ALso ich meine quasi jetzt liegt der Schlüssel ja unter Office11, wenn ich jetzt noch rechner mit win 2000 habe, dann liegt der Schlüssel ja vielleicht unter Office8, oder so? Das ist dann ja sogesehen auch wieder statisch... |
Re: Externes Programm starten
Zitat:
|
Re: Externes Programm starten
Magst du mir vielleicht einen Ansatz geben, wie ich das zu machen habe?
Ich habe noch nie mit der Registry und Delphi gearbeitet und möchte da natürlich nichts gleich kaputt machen... |
Re: Externes Programm starten
Aus einem Programm von mir. Wie du siehst hatte ich Ghostscript und Acrobat Distiller gesucht.
Tut mir leid, dass es nicht gut kommentiert ist und die Variablennamen ne Katastrophe sind. Ich hab jetzt keine Zeit für längere Ausführungen. Vielleicht schaffst du es ja, dich da durchzufitzen.
Delphi-Quellcode:
procedure LookUpRegistry;
{Suchen, wo evtl. Programme zum Erstellen von PDFs liegen} var reg:TRegistry; s:TStrings; p,i:integer; key,value:string; begin reg:=TRegistry.Create(KEY_READ); s:=TStringlist.Create; reg.rootkey:=HKEY_Local_Machine; key:=''; //Ghostscript if (gspfad='')or(not fileexists(gspfad)) then begin if reg.OpenKeyReadOnly('\Software\AFPL Ghostscript') then begin key:='\Software\AFPL Ghostscript'; reg.CloseKey; end else if reg.OpenKeyReadOnly('\Software') then begin reg.GetKeyNames(s); p:=-1; for i:=0 to s.Count-1 do if pos('Ghostscript',s.Strings[i])>0 then p:=i; if p>=0 then key:='\Software\'+s.Strings[p]; reg.CloseKey; end; if (length(key)>0) and (reg.OpenKeyReadOnly(key)) then begin reg.GetKeyNames(s); if s.count>0 then key:='\Software\AFPL Ghostscript\'+s.Strings[s.count-1]; reg.CloseKey; if reg.OpenKeyReadOnly(key) then begin value:=reg.ReadString('GS_DLL'); reg.CloseKey; if pos(';',value)>0 then value:=copy(value,1,pos(';',value)-1); value:=extractfiledir(value)+'\gswin32c.exe'; if fileexists(value) then gspfad:=value; end; end; end; //Distiller if (distpfad='')or(not fileexists(distpfad)) then begin key:='\Software\Adobe\Acrobat Distiller'; if reg.OpenKeyReadOnly(key) then begin reg.GetKeyNames(s); if s.count>0 then begin key:=key+'\'+s.strings[s.count-1]; reg.CloseKey; reg.OpenKeyReadOnly(key); value:=reg.ReadString('InstallPath'); if value='' then begin reg.CloseKey; key:=key+'\InstallPath'; reg.OpenKeyReadOnly(key); value:=reg.ReadString(''); end; if value<>'' then begin value:=value+'\acrodist.exe'; if fileexists(value) then distpfad:=value; end; end; reg.CloseKey; end; end; |
Re: Externes Programm starten
|
Re: Externes Programm starten
|
Re: Externes Programm starten
Hallo, ich habe versucht den Code von sirius umzuschreiben, doch leider gelingt mir das nicht. Also ich muss ja zunächst in den Schlüssel HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\OFFICE. Doch da komme ich ja schon gar nicht hin, weil er immer sagt "\ ist nicht erlaubt".
Dann muss ich ja nun schauen, welcher Schlüssel darunter liegt. Dieser kann sich ja nun ändern. Bei mir ist es 11.0 für Office 2003. Doch hier soll mein Programm nun selbst den Schlüssel suchen dann geht es weiter mit WORD\INSTALLROOT dort steht nun der Path. Wie kann ich denn den nun extrahieren und in einer Variable speichern? Das Aufrufen bekomme ich dann wieder hin, aber so ganz komme ich damit nicht klar und würde mich freuen, wenn mir jemand einige Codeschnipsel zur Verfügung stellen könnte. Viele Grüße, sebjensen |
Re: Externes Programm starten
Zitat:
|
Re: Externes Programm starten
Okay.
Hier ist mal der bisherige Quellcode der Leider überhaupt nicht läuft. Müsste ich auch für jedes Office-Programm (Word, Excel, Outlook, ...) eine neue Prozedur schreiben oder kann man das auch in einer lösen.
Delphi-Quellcode:
procedure LookUpRegistry;
{Suchen, wo MS Office Word liegt} var reg :TRegistry; s :TStrings; p,i :integer; key,value:string; wordpfad : string; begin reg := TRegistry.Create(KEY_READ); s := TStringlist.Create; reg.rootkey := HKEY_LOCAL_MACHINE; key := ''; if reg.OpenKeyReadOnly('\Software\Microsoft\Office') then begin key:=''; reg.CloseKey; end else if reg.OpenKeyReadOnly('\Software') then begin reg.GetKeyNames(s); p:=-1; for i:=0 to s.Count-1 do if pos('Microsoft',s.Strings[i])>0 then p:=i; if p>=0 then key:='\Software\'+ s.Strings[p]; reg.CloseKey; end; if (length(key) > 0) and (reg.OpenKeyReadOnly(key)) then begin reg.GetKeyNames(s); if s.count>0 then key:='\Software\Microsoft\' + s.Strings[s.count-1]; reg.CloseKey; if reg.OpenKeyReadOnly(key) then begin value:=reg.ReadString(''); reg.CloseKey; if pos(';',value)>0 then value:=copy(value,1,pos(';',value)-1); value:=extractfiledir(value)+'\winword.exe'; if fileexists(value) then wordpfad:=value; end; end; end; |
Re: Externes Programm starten
Also ich habe es noch weiter probiert, steige da aber nicht durch und habe es leider abbrechen müssen. Kann mir von euch Profis vielleicht jemand helfen...
|
Re: Externes Programm starten
Wirklich keiner der sich damit auskennt und mir helfen könnte? Schade, mein Programm ist im Kopf schon fertig und es fehlt nur noch die Umsetzung...
|
Re: Externes Programm starten
servus,
lass mal bei openkeyreadonly den ersten backslash weg, der ist da fehl am platze. ausserdem müsste da noch ein if not hin.
Delphi-Quellcode:
if not reg.OpenKeyReadOnly('Software\Microsoft\Office') then
begin key:=''; reg.CloseKey; end mfg Jonny |
Re: Externes Programm starten
Ich habe die Funktion so umgeschrieben, wie es in meiner Registry aussieht.
Delphi-Quellcode:
function LookUpRegistry:string;
{Suchen, wo MS Office Word liegt} var reg :TRegistry; s :TStrings; p,i :integer; key,value:string; wordpfad : string; begin reg := TRegistry.Create(KEY_READ); s := TStringlist.Create; reg.rootkey := HKEY_LOCAL_MACHINE; key := '\Software\Microsoft\Office'; wordpfad := ''; if reg.OpenKeyReadOnly(key) then begin reg.GetKeyNames(s); if s.count>0 then key:=key +'\'+ s.Strings[0]+'\Word\InstallRoot'; // Ich habe zur Probe s.strings[0] genommen // Du müsstest vorher die Stringlist durchsuchen, an welcher Stelle die höchste Versionsnummer steht reg.CloseKey; if reg.OpenKeyReadOnly(key) then begin value:=reg.ReadString('Path'); reg.CloseKey; value:=value+'\winword.exe'; if fileexists(value) then wordpfad:=value; end; result:=wordpfad; end; s.free; reg.free; end; |
Re: Externes Programm starten
Delphi-Quellcode:
ist falsch, es muss
key := '\Software\Microsoft\Office';
Delphi-Quellcode:
heissen.
key := 'Software\Microsoft\Office';
mfg Jonny |
Re: Externes Programm starten
Zitat:
|
Re: Externes Programm starten
Super. Schon einmal vielen Dank. Das klappt schon ganz gut. Nun habe ich aber noch einige Fragen...
(1) Wie laufe ich denn die Schlüssel durch und suche nach der höchsten Versionsnummer? Das sind doch Strings, wie kann ich die denn zerlegen? (2) Muss ich für jedes Office Programm so eine Funktion schreiben, oder kann ich einfach einen Parameter mit geben. Und dann sucht die Funktion nach '\Software\Microsoft\Office\xxx\11.0\....'? Vielen Dank schonmal für die Antworten... |
Re: Externes Programm starten
zu (1) Na du kannst mit TryStrToFloat die Strings in Zahlen umwandeln und dann die Größte nehmen.
zu (2) Du meinst wohl eher '\Software\Microsoft\Office\11.0\xxx....'? Natürlich geht auch. Ganz normale Parameterübergabe an Funktionen und an entsprechender Stelle dem String anfügen (z.B. statt Word) |
Re: Externes Programm starten
Hallo.
Irgendwie bekomme ich das nicht so hingebastelt, dass es läuft. Könntest du mir da vielleicht nochmal unter die Arme greifen? |
Re: Externes Programm starten
Delphi-Quellcode:
Leider funktioniert das so nicht. Ich erhalte eine Exception, dass 10.0 keine gültige Gleitkommazahl ist... wieso?
function LookUpRegistryForWord : string;
var reg : TRegistry; s : TStrings; p,i : integer; help : integer; v1, v2 : real; key,value : string; wordpfad : string; begin reg := TRegistry.Create(KEY_READ); s := TStringlist.Create; reg.rootkey := HKEY_LOCAL_MACHINE; key := '\Software\Microsoft\Office'; wordpfad := ''; help := 0; if reg.OpenKeyReadOnly(key) then begin reg.GetKeyNames(s); for i := 0 to s.Count-2 do begin TRY v1 := StrToFloat(s.Strings[i]); v2 := StrToFloat(s.Strings[i+1]); if (v1 < v2) then help := i+1; if (v1 > v2) then help := i; EXCEPT showMessage('Es ist leider ein Fehler aufgetreten'); end; end; key := key +'\'+ s.Strings[help]+'\Word\InstallRoot'; reg.CloseKey; if reg.OpenKeyReadOnly(key) then begin value:=reg.ReadString('Path'); reg.CloseKey; value := value + 'winword.exe'; if fileexists(value) then wordpfad := value; end; result:=wordpfad; end; s.free; reg.free; end; |
Re: Externes Programm starten
So funktioniert die Schleife nicht.
Du brauchst zwei Variablen. Die eine speichert den Maximalwert, die andere speichert wo er aufgetreten ist. Dann gehst du alle einzeln durch nimmst tryStrtofloat. Möglichst nie try-Except-block innerhalb einer Schleife! --> Verzögert das Programm nur unnötig. Auuserdem würde er dann bei mir immer die Messagebox liefern, da ich noch AddIns installiert habe die z.B. unter "\Software\Microsoft\Office\Word\Addins\..." liegen. Das Ergebnis von trystrtofloat vergleichst du mit dem Maximalwert (der zu Beginn der Funktion auf 0 gesetzt wird) und wenn er größer ist, mekrst du dir den neuen maximalwert und dessen Position. Und wo ist deine Parameterübergabe:
Delphi-Quellcode:
function xyz(parameter:string):string;
|
Re: Externes Programm starten
Hallo.
Leider kennt mein Delphi nicht TryStrToFloat. Daher habe ich das ganze mit einem Try-Except-Block umschlossen. VIelleicht könntest du mir sagen, wie ich das machen soll, da ich nicht weiß was ich speichern muss? Das mit dem Parameter kommt viel später, da ich erstmal das andere hinbekommen möchte. |
Re: Externes Programm starten
Welches Delphi hast du?
Dann versuchs mal mit "val", das gabs schon unter Borland Pascal. irgendwie so:
Delphi-Quellcode:
max:=0;
pos:=0; for i:=0 to s.count-1 do begin val(s[i],tmp,fehler); if (fehler=0)and(tmp>max) then begin max:=tmp; pos:=i; end; end; if pos=0 then //raise error else //benutze s[pos]; |
Re: Externes Programm starten
Ich benutze delphi 7.0.
Was ist denn bei dir temp und fehler? |
Re: Externes Programm starten
tmp ist natürlich die zwischengespeicherte Zielvariable und sollte genauso wie max irgendein Fließkommatyp sein. Und fehler ist integer.
Du könntest aber auch mal die Hilfe von Delphi benutzen! Übrigens gibts bei mir trystrtofloat und ich habe D7. |
Re: Externes Programm starten
Hallo.
Ich habe jetzt den ganzen Nachmittag damit zugebracht und bin überhaupt nicht weitergekommen. Ich habe überhaupts nicht geschafft. Könnten wir das Programm dann vielleicht zusammen erabeiten? Also den Ansatz verstehe ich ja, wir sind ja nun auch kurz vor dem Ziel... Wäre echt super! |
Re: Externes Programm starten
Was soll ich denn jetzt noch helfen bzw. entwickeln? Steht ja schon alles da.
Wenns bei dir nicht klappt, kannst du ja deinen code posten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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