Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Office 2010 - Click-To-Run - Installation erkennen (https://www.delphipraxis.net/172845-office-2010-click-run-installation-erkennen.html)

Angel4585 25. Jan 2013 10:52

Office 2010 - Click-To-Run - Installation erkennen
 
Guten Tag!

Ich habe das Problem, dass ich erkennen muss ob Office (bzw. Word und Excel) installiert sind.
Seit Office 2010 gibt es die sogenannten Click-To-Run Installatinen, bei denen die Software Ihre Registry-Einträge in eine virtuelle Registry legt.

Wie kann ich auf diese zugreifen um zu erkennen, ob die Software installiert ist oder nicht?

DeddyH 25. Jan 2013 11:44

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Das scheint tatsächlich nicht so einfach zu sein. Auf die Schnelle konnte ich nur diese beiden Beiträge finden:
http://answers.microsoft.com/en-us/o...6-1cc1de79d2e2
http://msdn.microsoft.com/en-us/libr...ffice.14).aspx
Nicht sonderlich befriedigend, vielleicht hilft es Dir trotzdem weiter.

RWarnecke 25. Jan 2013 12:17

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Ich würde die Sache etwas anderst angehen. Ich würde eher überpüfen, ob die Virtualisierung installiert ist und nicht die virtualen Registry-Keys abprüfen, da die sicherlich verschwinden, wenn ich Word, Excel oder Powerpoint wieder beende.

Bernhard Geyer 25. Jan 2013 13:16

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Wie verhält sich diese ClickToRun-Installation bezüglich Automatisierung (sprich ansprechen der COM-Schnittstelle)?

Angel4585 25. Jan 2013 14:10

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Mit COM kenn ich mich nicht aus, aber da die Klassen ja irgendwie über die Registry registriert werden, kann ich mir gut vorstellen, dass das dann nicht so ganz funktioniert :)

Hab leider kein Office mit dem ich das testen könnte.

RWarnecke 25. Jan 2013 14:15

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Vielleicht funktioniert ja der Link noch.

Walter Landwehr 8. Feb 2014 09:30

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Hallo,

ich löse das so:
Delphi-Quellcode:
function WordVersion: Double;
begin
  Result := 0.0;
  with TRegistry.Create do
  begin
    try
      if (KeyExists('Software\Microsoft') = True) then
      begin
        OpenKeyReadOnly('Software\Microsoft');
        if (KeyExists('Word\7.0') = True) then // Office 95
              Result := 7.0
      else
        if (KeyExists('Office') = True) then
        begin
          OpenKeyReadOnly('Office');
          if (KeyExists('8.0\Word') = True) then    // Office 97
             Result := 8.0
          else
             if (KeyExists('9.0\Word') = True) then  // Office 2001
               Result := 9.0
          else
             if (KeyExists('10.0\Word') = True) then // Office XP
               Result := 10.0
          else
             if (KeyExists('11.0\Word') = True) then // Office 2003
               Result := 11.0
          else
             if (KeyExists('12.0\Word') = True) then // Office 2007
               Result := 12.0
          else
             if (KeyExists('14.0\Word') = True) then // Office 2011
               Result := 14.0
          else
             if (KeyExists('15.0\Word') = True) then // Office 2013
               Result := 15.0;
        end;
      end
    finally
           Free;
      end;
  end;
end;

Sir Rufo 8. Feb 2014 10:45

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Warum das?
Delphi-Quellcode:
if (KeyExists('Software\Microsoft') = True) then
Mal in Worten gefasst
Code:
Wenn die Bedingung wahr ist nicht falsch ist dann
Ein einfaches
Delphi-Quellcode:
if KeyExists('Software\Microsoft') then
reicht völlig aus, ist besser zu lesen und liefert auch zuverlässig die richtige Reaktion, denn
Delphi-Quellcode:
const // definiert in Delphi
  False := 0;
  True := 1;
Aber bei
Delphi-Quellcode:
if
wird der
Delphi-Quellcode:
then
dann aufgerufen, wenn die Bedingung nicht falsch (
Delphi-Quellcode:
<> false
=>
Delphi-Quellcode:
<> 0
) ist.
Dadurch funktioniert das auch, wenn eine Funktion als Boolean etwas anderes als 1 zurückliefert (beliebt ist auch -1). Deine Abfrage würde jetzt aber scheitern, denn du prüfst ja ganz gezielt auf 1 ab.

RWarnecke 8. Feb 2014 11:47

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Die Funktion WordVersion liefert aber nicht zuverlässig die Version. Auf einem 64Bit Betriebssystem und ein Office 2010 64Bit wird nicht erkannt, außer ich kompiliere es als 64Bit Anwendung.

himitsu 8. Feb 2014 12:18

AW: Office 2010 - Click-To-Run - Installation erkennen
 
Pssst, ab dem ersten Else, bis zum Finally, gehört alles irgendwie bissl nach Rechts, denn dieses Else gehört zu dem, was man jetzt denken könnte.
(aber über Formatierung kann man ja bekanntlich streiten)
Single würde ja auch schon reichen, bei den kleinen Werten, wobei hier sogar ein Integer passen würde, da es ja (aktuell) keine Nachkommastellen gibt, wobei sich ein Integer aber "sicherer" vergleichen lässt.

Und OpenKeyReadOnly hat einen Rückgabewert, in dem das KeyExists schon eingebaut ist.




Zitat:

Zitat von RWarnecke (Beitrag 1247169)
Die Funktion WordVersion liefert aber nicht zuverlässig die Version. Auf einem 64Bit Betriebssystem und ein Office 2010 64Bit wird nicht erkannt, außer ich kompiliere es als 64Bit Anwendung.

Gab es da nicht einen Befehl, welcher diese Umleitung deaktiviert?

Ansonsten fängt man ja an:
- 32 Bit-Windows mit 32 Bit-Word
- 64 Bit-Windows mit 64 Bit-Word
- 64 Bit-Windows mit 32 Bit-Word





Delphi-Quellcode:
// Wenn ich dein Muster der Formatierung konsequennt versucht weiterzuverfolgen, dann lande ich hier.
function WordVersion: Integer;
begin
  Result := 0;
  with TRegistry.Create do
    try
      if OpenKeyReadOnly('Software\Microsoft') then
        if KeyExists('Word\7.0') then // Office 95
          Result := 7
        else
          if OpenKeyReadOnly('Office') then
            if KeyExists('8.0\Word') then // Office 97
              Result := 8
            else
              if KeyExists('9.0\Word') then // Office 2001
                Result := 9
            else
              if KeyExists('10.0\Word') then // Office XP
                Result := 10
            else
              if KeyExists('11.0\Word') then // Office 2003
                Result := 11
            else
              if KeyExists('12.0\Word') then // Office 2007
                Result := 12
            else
              if KeyExists('14.0\Word') then // Office 2011
                Result := 14
            else
              if KeyExists('15.0\Word') then // Office 2013
                Result := 15;
    finally
      Free;
    end;
end;


// Oder man zieht alle IFs auf die selbe Ebene, welche als ELSE-IF zusammenhängen.
function WordVersion: Integer;
begin
  Result := 0;
  with TRegistry.Create do
    try
      if OpenKeyReadOnly('Software\Microsoft') then
        if KeyExists('Word\7.0') then // Office 95
          Result := 7
        else
        if OpenKeyReadOnly('Office') then
          if KeyExists('8.0\Word') then // Office 97
            Result := 8
          else
          if KeyExists('9.0\Word') then // Office 2001
            Result := 9
          else
          if KeyExists('10.0\Word') then // Office XP
            Result := 10
          else
          if KeyExists('11.0\Word') then // Office 2003
            Result := 11
          else
          if KeyExists('12.0\Word') then // Office 2007
            Result := 12
          else
          if KeyExists('14.0\Word') then // Office 2011
            Result := 14
          else
          if KeyExists('15.0\Word') then // Office 2013
            Result := 15;
    finally
      Free;
    end;
end;


// Wenn man die nun auch wieder entsprechend dem ELSE aufteilt und das ELSE-IF nicht zusammenhängend sieht, dann sieht das schnell so aus.
// Denn so, wie im Beispiel 1 (welches deiner Vorlage entsprach), würden sonst die ELSE vom IF scheinbar eine Ebene wegrutschen.
function WordVersion: Integer;
begin
  Result := 0;
  with TRegistry.Create do
    try
      if OpenKeyReadOnly('Software\Microsoft') then
        if KeyExists('Word\7.0') then // Office 95
          Result := 7
        else
          if OpenKeyReadOnly('Office') then
            if KeyExists('8.0\Word') then // Office 97
              Result := 8
            else
              if KeyExists('9.0\Word') then // Office 2001
                Result := 9
              else
                if KeyExists('10.0\Word') then // Office XP
                  Result := 10
                else
                  if KeyExists('11.0\Word') then // Office 2003
                    Result := 11
                  else
                    if KeyExists('12.0\Word') then // Office 2007
                      Result := 12
                    else
                      if KeyExists('14.0\Word') then // Office 2011
                        Result := 14
                      else
                        if KeyExists('15.0\Word') then // Office 2013
                          Result := 15;
    finally
      Free;
    end;
end;


// Während ich die ELSE-IF dann doch lieber auch zusammenhänge. Quasi so, als gäbe es auch im Delphi einen zusammenhängenden Elseif-Befehl.
// Denn dann kann man die Einrückung wieder problemlos konsequennt durchziehen.
function WordVersion: Integer;
begin
  Result := 0;
  with TRegistry.Create do
    try
      if OpenKeyReadOnly('Software\Microsoft') then
        if KeyExists('Word\7.0') then // Office 95
          Result := 7
        else if OpenKeyReadOnly('Office') then
          if KeyExists('8.0\Word') then // Office 97
            Result := 8
          else if KeyExists('9.0\Word') then // Office 2001
            Result := 9
          else if KeyExists('10.0\Word') then // Office XP
            Result := 10
          else if KeyExists('11.0\Word') then // Office 2003
            Result := 11
          else if KeyExists('12.0\Word') then // Office 2007
            Result := 12
          else if KeyExists('14.0\Word') then // Office 2011
            Result := 14
          else if KeyExists('15.0\Word') then // Office 2013
            Result := 15;
    finally
      Free;
    end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz