![]() |
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? |
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:
![]() ![]() Nicht sonderlich befriedigend, vielleicht hilft es Dir trotzdem weiter. |
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.
|
AW: Office 2010 - Click-To-Run - Installation erkennen
Wie verhält sich diese ClickToRun-Installation bezüglich Automatisierung (sprich ansprechen der COM-Schnittstelle)?
|
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. |
AW: Office 2010 - Click-To-Run - Installation erkennen
Vielleicht funktioniert ja der
![]() |
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; |
AW: Office 2010 - Click-To-Run - Installation erkennen
Warum das?
Delphi-Quellcode:
Mal in Worten gefasst
if (KeyExists('Software\Microsoft') = True) then
Code:
Ein einfaches
Wenn die Bedingung wahr ist nicht falsch ist dann
Delphi-Quellcode:
reicht völlig aus, ist besser zu lesen und liefert auch zuverlässig die richtige Reaktion, denn
if KeyExists('Software\Microsoft') then
Delphi-Quellcode:
Aber bei
const // definiert in Delphi
False := 0; True := 1;
Delphi-Quellcode:
wird der
if
Delphi-Quellcode:
dann aufgerufen, wenn die Bedingung nicht falsch (
then
Delphi-Quellcode:
=>
<> false
Delphi-Quellcode:
) ist.
<> 0
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. |
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.
|
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:
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 01:36 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