Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: So 15.08.10 09:18 
Hi, Delpher,
ich versuche zu prüfen, ob Word auf dem Rechner vorhanden ist, also eigentlich nur, ob es die exe gibt.
Mit dem folgenden Code wird aber Word gestartet, was aber nur den Arbeitsspeicher füllt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function tBuchMain.Word_vorhanden: boolean;
begin
  Word_vorhanden := false;
  try
    MSWord := CreateOleObject('Word.Application');
    Word_vorhanden := true;
    MSWord := unassigned;
  except
    ShowMessage('Word kann nicht gestartet werden!');
    Word1.enabled := false;  // ist TMenuItem
    Exit;
  end;
end;


Wie geht es besser?
Danke, Gruß
Detlef


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am So 15.08.2010 um 12:26

_________________
ut vires desint, tamen est laudanda voluntas
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: So 15.08.10 12:21 
user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
ich versuche zu prüfen, ob Word auf dem Rechner vorhanden ist, also eigentlich nur, ob es die exe gibt.
Lese doch einfach den entsprechenden Eintrag in der Registry aus.
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\Winword.EXE
Unter Standard findest Du dann den kompletten Pfad inklusive Namen der Exe. Wenn Du möchtest, kannst Du dann noch mit FileExists prüfen, ob die Datei auch wirklich auf der Platte ist.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mo 16.08.10 19:01 
Danke, Gerd,
das werde ich mal prüfen.
Gruß, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 16.08.10 22:11 
Ich hab mal ein kleines Beispiel geschrieben. Die Funktion liefert den vollständigen (langen) Pfadnamen mit dem Exe-Namen zurück. Da es jede Firma anders hält mit den Registry-Einträgen (lange oder kurze Pfadnamen, teilweise beim Pfadnamen ohne "\" am Ende), sind einige Prüfungen erforderlich.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
procedure TMainform.Button1Click(Sender: TObject);
begin
  Label1.Caption := IstProgrammVorhanden(Edit1.Text); // z. B. "winword" oder "winrar.exe"
  if Label1.Caption <> 'Nicht gefunden.' then
    if FileExists(Label1.Caption) then
      Label2.Caption := 'Datei ist auf der Platte vorhanden.'
    else
      Label2.Caption := 'Datei fehlt auf der Platte!';
end;

// uses Registry;
function TMainform.IstProgrammVorhanden(ProgName: string): string;
var
  Reg     : TRegistry;
  TempStr : string;
begin
  Result := 'Nicht gefunden.';
  TempStr := '\Software\Microsoft\Windows\CurrentVersion\App Paths\' + ProgName;
  if Pos('.EXE', UpperCase(ProgName)) = 0 then
    TempStr := TempStr +'.Exe';
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKey_Local_Machine;
    if Reg.OpenKeyReadOnly(TempStr) then     // nur Lesezugriff
      begin
        Result := Reg.ReadString('');        // '' = Standard-Schlüssel
        if Pos('~', Result) > 0 then         // kurze Pfadnamen?
          begin
            TempStr := ExtractFileName(Result);
            Result := Reg.ReadString('Path');
            if AnsiLastChar(Result) <> '\' then
              Result := Result + '\' + TempStr
            else
              Result := Result + TempStr;
          end;
      end;
    Reg.CloseKey;
  finally
    Reg.Free;
  end;
end;

Getestet mit BDS2006 unter Windows 7 (32-Bit). Ob es auch unter 64 bit läuft, kann ich hier leider nicht testen.
Edit: Fehlenden Punkt in Zeile 4 nachgetragen.


Zuletzt bearbeitet von Gerd Kayser am Di 17.08.10 19:12, insgesamt 1-mal bearbeitet
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 17.08.10 10:36 
Hi, Gerd,
ich habe erst eben gesehen, dass du noch einmal umfänglich tätig warst - super!
Heute abend komme ich dazu, den Code anzupassen und zu prüfen, dann melde ich
mich wieder bei dir.
Gruß, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 17.08.10 18:40 
Hi, Gerd,
läuft SUPER!
Vielen Dank für deine Mühe!
Detlef

_________________
ut vires desint, tamen est laudanda voluntas