Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ActiveX - Installierte Version feststellen. (https://www.delphipraxis.net/182439-activex-installierte-version-feststellen.html)

bernau 24. Okt 2014 09:46

ActiveX - Installierte Version feststellen.
 
Mit Hier im Forum suchenCLSIDFromProgID kann man ermitteln, ob ein ActiveX installiert ist. (Quelle)

Nun würde ich gerne die Version des installierten ActiveX auslesen. Eine Funktion dafür habe ich aber nicht gefunden.

Ich könnte natürlich die Registry durchsuchen. Wenn das ActiveX installiert ist, steht die Version in der Registry an folgenden stellen:

Code:
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{68385E69-C276-4EC1-ACE0-2EA6C831B127}\Version
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{68385E69-C276-4EC1-ACE0-2EA6C831B127}\Version
Die Schlüssel kann ich auslesen. Aber!!

1) Welchen von beiden Schlüsseln sollte ich nehmen?

2) Ist der Schlüssel für jeden Computer gleich. Das Stück "Wow6432Node" wirkt auf mich, daß dieser Schlüssel bei 64Bit-Windows anders ist als bei 32Bit-Windows. Gibt es in Delphi eine Funktion, welche mir den Standard-Key (für HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CL SID) zurück gibt?

Bernhard Geyer 24. Okt 2014 09:54

AW: ActiveX - Installierte Version feststellen.
 
zu 1:
Beide Schlüssel sind gleich.
Das eine ist nur ein "Abkürzung" zu dem gleichen Registry-Zweig

zu 2:
Kann dir egal sein. Du nimmst den Wert für ein 32-Bit Windows. Windows sorgt automatisch dafür das für 64-Bit Windows deine Registry-Abfrage aus einer 32-Bit Anwendung korrekt umgebogen wird

himitsu 24. Okt 2014 10:04

AW: ActiveX - Installierte Version feststellen.
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1277269)
Das eine ist nur ein "Abkürzung" zu dem gleichen Registry-Zweig

Nicht ganz.

HKEY_CLASSES_ROOT ist ein Merge, aus vorallem HKEY_LOCAL_MACHINE\SOFTWARE\Classes und HKEY_CURRENT_USER\Software\Classes , welches für den Benutzer zusammengemischt wird, in dessen Kontext das Programm gerade läuft. (standardmäßig also der des eingeloggten Benutzers)
In HKEY_LOCAL_MACHINE\SOFTWARE\Classes findet man die globalem Dinge für alle Benutzer, welche für einzelne Benutzer erweitert oder überschieben werden können.
Und HKEY_CURRENT_USER ist natürlich eine Weiterleitung zum entsprechenden Benutzerpfad in HKEY_USERS.

Es gibt womöglich auch noch ein HKEY_CURRENT_USER\Software\Classes\Wow6432Node.
Dich hat also vorallem nur HKEY_CLASSES_ROOT zu interessieren, wenn du die "aktuellen" Werte wissen willst.


Und wie beim Dateisystem, gibt es auch in der Registry eine Virtualisierung, wo vorallem die Pfade der 32-Bit-Anwendungen im WOW64 umgeleidet werden können.
Wenn man sich aber nur für Werte zu seinem System interessiert (also die eigene Bittigkeit entsprechend), dann muß man praktisch nichts beachten.

Wenn dein Programm sich auch nicht als kompatibel zu der WindowsVersion ausgibt, dann kann es auch schnell mal in HKEY_CLASSES_ROOT\VirtualStore landen. :stupid:

bernau 24. Okt 2014 10:24

AW: ActiveX - Installierte Version feststellen.
 
Danke euch beiden. Jetzt bin ich schlauer. Klappt hervoragend.

Bernhard Geyer 24. Okt 2014 10:28

AW: ActiveX - Installierte Version feststellen.
 
Zitat:

Zitat von himitsu (Beitrag 1277271)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1277269)
Das eine ist nur ein "Abkürzung" zu dem gleichen Registry-Zweig

Nicht ganz.

HKEY_CLASSES_ROOT ist ein Merge, aus vorallem HKEY_LOCAL_MACHINE\SOFTWARE\Classes und HKEY_CURRENT_USER\Software\Classes ,

Stimmt. Da war ja noch was mittels SideBySide und Installation ActiveX im User-Kontext ...

sx2008 25. Okt 2014 00:09

AW: ActiveX - Installierte Version feststellen.
 
Registry auslesen ist doch Pfui
Delphi-Quellcode:
function CoClassExists(const ClassID:TGuid):Boolean;
var
   hr : HRESULT;
   progid : PWideChar;
begin
   hr := ProgIDFromCLSID(ClassID, progid);
   Result := Succeeded(hr);
end;

const
  myclass:TGUID = '{68385E69-C276-4EC1-ACE0-2EA6C831B127}';

begin
  if not CoClassExists(myclass) then
     // ActiveX Klasse ist nicht installiert

Bernhard Geyer 25. Okt 2014 08:12

AW: ActiveX - Installierte Version feststellen.
 
Zitat:

Zitat von sx2008 (Beitrag 1277354)
Registry auslesen ist doch Pfui
Delphi-Quellcode:
function CoClassExists(const ClassID:TGuid):Boolean;
...

Und wo ist hier jetzt die Version zu finden?
Wie kann ich den Boolean in den korrekten Versionsstring wandeln?

sx2008 25. Okt 2014 16:00

AW: ActiveX - Installierte Version feststellen.
 
Hab die Frage nur ungenau überflogen :-[

Wenn man das Interface ITypeLib am Wickel hat dann kann man die Version mit GetLibAttr() auslesen. Mit ReleaseTLibAttr() muss die TLIBATTR Struktur wieder freigegeben werden.

Bernhard Geyer 25. Okt 2014 16:17

AW: ActiveX - Installierte Version feststellen.
 
Zitat:

Zitat von sx2008 (Beitrag 1277394)
Hab die Frage nur ungenau überflogen :-[

passiert ab und zu :wink:

Zitat:

Zitat von sx2008 (Beitrag 1277394)
Wenn man das Interface ITypeLib am Wickel hat dann kann man die Version mit GetLibAttr() auslesen. Mit ReleaseTLibAttr() muss die TLIBATTR Struktur wieder freigegeben werden.

Das kannte ich noch nicht. Könnte evtl. manche Reg-Hack-Funktion darauf umstellen :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.

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