Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Externes Programm starten (https://www.delphipraxis.net/85395-externes-programm-starten.html)

sebjensen 30. Jan 2007 09:27


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.

sirius 30. Jan 2007 09:31

Re: Externes Programm starten
 
Suche mal nach "shellexecute"
Oder wenn du die Ausführung des Programmes überwachen willst, ist "CreateProcess" wahrscheinlich besser.

sebjensen 30. Jan 2007 09:35

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.

Pfoto 30. Jan 2007 09:39

Re: Externes Programm starten
 
Zitat:

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

Dazu ist es wohl am sichersten, die Registry abzufragen,
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

sebjensen 30. Jan 2007 09:42

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...

Klaus01 30. Jan 2007 10:00

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

sebjensen 30. Jan 2007 10:09

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..

sirius 30. Jan 2007 10:18

Re: Externes Programm starten
 
CreateProcess

Klaus01 30. Jan 2007 10:21

Re: Externes Programm starten
 
Zitat:

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

Wenn ich über Ausführen als das cmd starte und in dem Fenster(Console) Winword eingebe..

Grüße
Klaus

sebjensen 30. Jan 2007 10:23

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...

Klaus01 30. Jan 2007 10:37

Re: Externes Programm starten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von sebjensen
Super.

Nur wie bekomme ich jetzt den Pfad zu zum Beispiel Word?

Aus der Registry, siehe Bild.

Grüße
Klaus

sebjensen 30. Jan 2007 10:40

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...

sirius 30. Jan 2007 10:48

Re: Externes Programm starten
 
Zitat:

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

Es gibt ja die Möglichkeit zu suchen, bzw, die alle Versionen in eine TStringList zu laden (getkeynames). Und dann kannst du dir eine aussuchen.

sebjensen 30. Jan 2007 13:57

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...

sirius 30. Jan 2007 14:05

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;

inherited 30. Jan 2007 14:06

Re: Externes Programm starten
 
Hier im Forum suchenRegistry, RegistryRegistry :mrgreen:
Da müsstest du genug Beispiele finden.

Thorben_K 30. Jan 2007 14:06

Re: Externes Programm starten
 
Tut

damit hab ich es gelernt, bin damit gut zu recht gekommen :D

sebjensen 30. Jan 2007 15:53

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

inherited 30. Jan 2007 16:51

Re: Externes Programm starten
 
Zitat:

Zitat von sebjensen
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".[...]

Du musst schon ein wenig Code zeigen, sonst kann dir keiner sagen, wo der Fehler liegt ;)

sebjensen 30. Jan 2007 19:57

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;

sebjensen 31. Jan 2007 12:01

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...

sebjensen 1. Feb 2007 06:37

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...

JonnyGuitar 1. Feb 2007 08:58

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

sirius 1. Feb 2007 09:06

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;

JonnyGuitar 1. Feb 2007 09:34

Re: Externes Programm starten
 
Delphi-Quellcode:
key        := '\Software\Microsoft\Office';
ist falsch, es muss
Delphi-Quellcode:
key        := 'Software\Microsoft\Office';
heissen.


mfg Jonny

sirius 1. Feb 2007 09:47

Re: Externes Programm starten
 
Zitat:

Zitat von JonnyGuitar
Delphi-Quellcode:
key        := '\Software\Microsoft\Office';
ist falsch, es muss
Delphi-Quellcode:
key        := 'Software\Microsoft\Office';
heissen.

Bei mir funktioniert beides.

sebjensen 2. Feb 2007 08:55

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...

sirius 2. Feb 2007 09:09

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)

sebjensen 2. Feb 2007 09:20

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?

sebjensen 2. Feb 2007 09:42

Re: Externes Programm starten
 
Delphi-Quellcode:
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;
Leider funktioniert das so nicht. Ich erhalte eine Exception, dass 10.0 keine gültige Gleitkommazahl ist... wieso?

sirius 2. Feb 2007 10:17

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;

sebjensen 2. Feb 2007 10:33

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.

sirius 2. Feb 2007 10:43

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];

sebjensen 2. Feb 2007 10:52

Re: Externes Programm starten
 
Ich benutze delphi 7.0.


Was ist denn bei dir temp und fehler?

sirius 2. Feb 2007 12:22

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.

sebjensen 2. Feb 2007 19:48

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!

sirius 3. Feb 2007 11:45

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