Autor Beitrag
TheSECONDJoker
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 10.03.05 22:44 
Hi,

ich möchte bzw. muss für ein programm, welches ich schreibe, die installierte office version automatisch ermitteln. ich habe ehrlich gesagt absolut kein ahnung, wie ich das machen soll.
habe eine datei gefunden, welche bei office97 und bei office2k vorkommt und bei beiden auch unterschiedlich ist. leider ich das ganze ein bisschen zu unsicher und außerdem konnte ich eine solche datei nicht unter officexp finden.

kann mir bitte mal jemand sagen, wie ich das programmieren kann (bitte mit source code)? hänge da momentan echt fest.


gruß
thesecondjoker
NeoInDerMATRIX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 245

Win95, Win98(+se), WinNT, Win2000, WinME, WinXP(+pro), VISTA, Linux(SuSe), DOS [MultiMon(3)], Vista
D6 PeE + (FP 2.0l) + D3 Pe + D2005+ D2006 Arch
BeitragVerfasst: Do 10.03.05 23:06 
Hi,

schau dir mal den Registry Key "HKey_Local_Machine\Software\Microsoft\Office" an. Der könnte etwas für dich sein!

Cu
Neo
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Do 10.03.05 23:11 
Orientier die an der Produktreihe aus der Registry.

Mein Office XP besteht beispielsweise aus Word v10.235.343, Powerpoint v10.2455.23 usw.
In der Registry gibts dann unter local_machine -> Software -> Microsoft -> Office die Pfade 10, 9, 8, 7, 6. Wenn es den Pfad 10 auf einem System gibt, kann man sich also relativ sicher sein dass er Office XP hat.

Suche in: Delphi-Forum, Delphi-Library REGISTRY, falls du nicht weisst wie man mit ihr arbeitet.

Edit: Ich tipp einfach zu lange... ;)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 11.03.05 09:15 
HKCL\Word.Application --> ''. Unter diesem Key steht ein Verweis auf Word.Application.10 (für Office2000, ansonsten dementsprechend).

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 11.03.05 09:38 
user profile iconKarlson hat folgendes geschrieben:
Orientier die an der Produktreihe aus der Registry.

Mein Office XP besteht beispielsweise aus Word v10.235.343, Powerpoint v10.2455.23 usw.
In der Registry gibts dann unter local_machine -> Software -> Microsoft -> Office die Pfade 10, 9, 8, 7, 6. Wenn es den Pfad 10 auf einem System gibt, kann man sich also relativ sicher sein dass er Office XP hat.

Es soll Leute geben, die Office XP benutzen, dann aber (warum auch immer ;)) wieder zu Office 2000 zurückkehren oder vllt. auf Office 2003 wechseln oder Open-office benutzen und MS-Office entfernen. Der 10er-Schlüssel bleibt dann aber in der Registry, selbst wenn die entsprechende Office-Version entfernt wird. So sicher würde ich also bei der Methode nicht sein. :)
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Fr 11.03.05 10:30 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
uses ComObj;

{
const
  Wordversion97 = 8;
  Wordversion2000 = 9;
  WordversionXP = 10;
  Wordversion2003 = 11;
}

function GetInstalledWordVersion: Integer;
var
  word: OLEVariant;
begin
  word := CreateOLEObject('Word.Application');
  result := word.version;
  word.Quit;
  word := UnAssigned;
end;



Das funktioniert sicherlich auch mit den anderen Office anwendungen !!

Vielleicht hilft's ja

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 11.03.05 10:32 
user profile iconchrisw hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function GetInstalledWordVersion: Integer;
var
  word: OLEVariant;
begin
  word := CreateOLEObject('Word.Application');
  result := word.version;
  word.Quit;
  word := UnAssigned;
end;



Das funktioniert sicherlich auch mit den anderen Office anwendungen !!

Vielleicht hilft's ja


Dir ist aber klar, was passiert, wenn der Anwender kein Word installiert hat?

AXMD
Amiga-Fan
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: Fr 11.03.05 11:22 
Eine Exception? Try.. Except drum...
TheSECONDJoker Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 11.03.05 13:31 
vielen dank erstmal für die bisherigen bemühungen.

mir ist noch etwas eingefallen. vielleicht wäre es möglich die office version aus der winword.exe auszulesen. ich müsste halt nur für den Office Ordner (wegen Office10, Office11 etc.) so was wie ne wildcard setzen, wobei ich mal vermute, dass ein pfad auf jeden fall absolut sein muss, oder?

wenn das vielleicht doch möglich wäre, dann müsstet ihr mir bitte nur noch sagen, wie ich eine versionsnr. aus einer exe auslesen kann (möglichst auch hier wieder mit so was wie wildcards, da sich durch service packs oder service releases die absolute versionsnr. wieder ändern kann).

anderenfalls, würde ich die idee von chrisw aufschnappen und lediglich überprüfen ob der root ordner vom office (c:\programme\microsoft office\) existiert.
TheSECONDJoker Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 14.03.05 10:02 
Hallo? Kann mir bitte nochmal jemand helfen?

Ich habe schon mal für das Abfragen der Dateiversion etwas rausgefunden:

GetFileVersion()

Allerdings bekomme ich immer den Maximalwert der Integer- bzw. genau gesagt Cardinalzahl. Woran kann das liegen? Ich hätte gerne die Versionsnummer, so wie sie in der Datei auch steht!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 14.03.05 13:02 
Frag mal den Wert der Funktion GEtLastError ab und poste diesen. Möglichst nach jedem API-Aufruf.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Shaky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72

WinXP
D5, Delphi 2005 Prof.
BeitragVerfasst: Fr 01.04.05 13:12 
ich musste da Programm auch schreiben.

falls du es noch brauchst. Hier bitteschön.

ausblenden volle Höhe 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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, registry, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    procedure RegEintraege;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.RegEintraege;
var
  r_haupt,r_office,r_progs: TRegIniFile;
  Haupt,Office,Progs: TStringList;
  m,n,ka,i,j,g: Integer;
  Datei,Name,Ordner,Ordner2,hilf: String;
  drin : Boolean;
  version, filename, prog, v_name : Array [0..3] of string;
begin
   version[0]:='8';
   version[1]:='9';
   version[2]:='10';
   version[3]:='11';
   v_name[0]:='Office 97';
   v_name[1]:='Office 2000';
   v_name[2]:='Office XP';
   v_name[3]:='Office 2003';
   filename[0]:='winword.exe';
   filename[1]:='excel.exe';
   filename[2]:='Access.exe';
   filename[3]:='Powerpoint.exe';
   prog[0]:='Word';
   prog[1]:='Excel';
   prog[2]:='Access';
   prog[3]:='Powerpoint';
  Haupt := TStringList.Create;
  Office := TStringList.Create;
  Progs := TStringList.Create;
  try
    begin
      for n:=0 to 3 do
      begin
         r_haupt := TRegIniFile.Create;
         r_haupt.RootKey := HKEY_LOCAL_MACHINE;
          if r_haupt.OpenKey('Software\Microsoft\Office', FALSE) then
          r_haupt.ReadSections(Haupt);
        for i := 0 to Haupt.Count - 1 do
        begin
          r_office:=r_haupt;
          ordner := Haupt.Strings[i];
          ka:=pos('.',ordner);
          hilf:=copy(ordner,0,ka-1);
          if hilf = version[n] then
          begin
            r_office.OpenKey(ordner, FALSE);
            r_progs:=r_office;
            r_office.ReadSections(Office);
            for j := 0 to Office.Count - 1 do
            begin
               ordner2 := Office.Strings[j];
               for m:=0 to 3 do
               begin
                 if ordner2 = prog[m] then
                  begin
                    r_progs.OpenKey(prog[m], FALSE);
                    r_progs.ReadSections(Progs);
                    for g := 0 to Progs.Count - 1 do
                    begin
                      Name := r_progs.ReadString(Progs[g], 'Path', '');
                      datei:=name+filename[m];
                      drin:=FileExists(datei);
                      if drin=true then listbox1.items.add(v_name[n] + ' : ' + datei);
                    end;
                  end;
                end;
            end;
          end;
      end;
    end;
    Haupt.Free;
    end;
  finally
    r_haupt.Free;
    Progs.Free;
    Office.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RegEintraege;
end;

end.