Rubrik: COM/OLE/Registry/DLL · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 05.09.03 |
Pfad einer ActiveX-Komponente ermitteln Dieser Tipp zeigt, wie sich prüfen lässt, ob eine ActiveX-Komponente vorhanden ist, indem man den dazugehörigen Pfad aus der Registry ausiest. | ||
Autor: Florian Platzer | Bewertung: | Views: 22.678 |
www.vbmaster.gbadmin.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Haben Sie sich auch schon einmal gefragt, wie man prüfen kann, in welchem Verzeichnis sich eine bestimmte ActiveX-Komponente befindet? Hierzu braucht man lediglich den Klassennamen der Komponenten zu wissen. Ist die ActiveX-Komponente bereits auf dem System installiert und registriert, legt Windows den dazugehörigen Pfad in der Registry ab.
Unser heutiger Tipp zeigt, wie man anhand des Klassennamen das Verzeichnis der ActiveX-Komponente ermitteln kann.
Fügen Sie hierzu nachfolgenden Code in ein Modul:
Option Explicit ' benötigte API-Deklarationen Private Const HKEY_CLASSES_ROOT As Long = &H80000000 Private Const KEY_QUERY_VALUE = &H1 Private Const KEY_ENUMERATE_SUB_KEYS = &H8 Private Const KEY_NOTIFY = &H10 Private Const KEY_READ = KEY_QUERY_VALUE Or _ KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Private Const REG_SZ = 1 Private Const REG_DWORD = 4 Private Const ERROR_SUCCESS = 0& Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _ Alias "RegOpenKeyExA" ( _ ByVal hKey As Long, _ ByVal lpSubKey As String, _ ByVal ulOptions As Long, _ ByVal samDesired As Long, _ phkResult As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" ( _ ByVal hKey As Long) As Long Private Declare Function RegQueryValueEx Lib "advapi32.dll" _ Alias "RegQueryValueExA" ( _ ByVal hKey As Long, _ ByVal lpValueName As String, _ ByVal lpReserved As Long, _ lpType As Long, _ lpData As Any, _ lpcbData As Any) As Long
' Wert aus Registry auslesen Public Function GetValue(ByVal hKey As Long, _ ByVal sKey As String, _ ByVal sField As String, _ vValue As Variant) As Boolean Dim nResult As Long Dim nKeyOpen As Long Dim dwType As Long Dim nValue As Long Dim nLen As Long Dim sBuffer As String GetValue = False ' Registry-Schlüssel öffnen nResult = RegOpenKeyEx(hKey, sKey, 0, KEY_READ, nKeyOpen) If nResult <> ERROR_SUCCESS Then Exit Function ' Werte-Typ bestimmen nResult = RegQueryValueEx(nKeyOpen, sField, 0&, _ dwType, ByVal 0&, nLen) If nResult = ERROR_SUCCESS Then Select Case dwType Case REG_SZ ' String sBuffer = Space$(nLen + 1) nResult = RegQueryValueEx(nKeyOpen, sField, 0&, _ dwType, ByVal sBuffer, nLen) If nResult = ERROR_SUCCESS Then vValue = Left$(sBuffer, nLen - 1) End If Case REG_DWORD ' DWord nLen = 4 nResult = RegQueryValueEx(nKeyOpen, sField, 0&, _ dwType, nValue, nLen) If nResult = ERROR_SUCCESS Then vValue = nValue End Select ' Schließen RegCloseKey nKeyOpen End If GetValue = (nResult = ERROR_SUCCESS) End Function
' Pfad anhand Klassennamen auslesen Public Function GetClassPath(ByVal sClass As String) Dim sValue As String Dim sPath As String If GetValue(HKEY_CLASSES_ROOT, sClass & "\Clsid", "", sValue) Then sPath = "CLSID\" & sValue If GetValue(HKEY_CLASSES_ROOT, sPath, "", sValue) Then sPath = sPath & "\InprocServer32" If GetValue(HKEY_CLASSES_ROOT, sPath, "", sValue) Then GetClassPath = sValue End If End If End If End Function
Beispiel:
Sie möchten wissen, in welchem Verzeichnis sich die DAO 3.6 DLL befindet.
Dim sPath As String sPath = GetClassPath("DAO.DBEngine.36") MsgBox sPath
Oder: In welchem Verzeichnis befindet das Windows-Common-Control OCX (Version 6)?
MsgBox GetClassPath("MSComctlLib.ListViewCtrl")
Oder: ...
Sie sehen schon: wenn die ActiveX-Komponente als solche im System registriert ist, lässt sich über den jeweiligen Klassennamen sehr einfach der Pfad zur ActiveX-Datei ermitteln.