2011-02-11 19 views

Respuesta

3

Puede buscar a través del registro para esto. Suponiendo que no conoce los objetos COM que figuran en el archivo DLL, primero tendrá que buscar el nombre de la DLL en HKEY_CLASSES_ROOT.

Luego use el nombre de la clase para encontrar el CLSID en HKEY_CLASSES_ROOT\[ClassName]\CLSID y finalmente debe poder encontrar el CLSID como HKEY_CLASSES_ROOT\CLSID\[CLSID].

Tenga en cuenta, ubicaciones del registro escrito de la memoria, así que puede ser un poco apagado.

Editar: O si se conoce el nombre de la clase que sólo podría tratar de crear una instancia de ella y ver si funciona o no.

1

Mira el rgistry en HKEY_CLASSES_ROOT \ CLSID \\ InprocServer. Si tiene ese registro, entonces la DLL debe estar registrada.

-1

Esta es la forma correcta de hacerlo. Implica PInvoke, pero eso "solo porque no han proporcionado esta capacidad en .NET directamente.

[DllImport("kernel32")]  
public extern static int LoadLibrary(string lpLibFileName); 

[DllImport("kernel32")]  
public extern static bool FreeLibrary(int hLibModule);   

public bool IsDllRegistered(string DllName)  
{  
    int libId = LoadLibrary(DllName); 
    if (libId>0) FreeLibrary(libId); 
    return (libId>0);  
} 
+0

No creo que esto sea del todo correcto. Carga * cualquier * DLL, independientemente de si está registrado como servidor de un objeto COM. –

+0

@Steve, está cargando un dll por nombre y no por una ruta completa. Si el dll carga, ha sido registrado. Si no, no ha sido registrado. A menos que el dll que estás buscando también esté en tu camino. –

+0

Para que quede claro, LoadLibrary seguido de DllGetClassObject (con CLSID e IID de la interfaz) le proporciona una instancia de un objeto COM con el que puede jugar. Si falla la biblioteca de carga, no va a funcionar, punto. –

4

Los enfoques de registro están bien y vale la pena hacerlo, pero para asegurarse de que también se puede considerar una instancia de algo desde dentro del objeto COM envuelta en un intento de captura {} (COMException) {}, a continuación, presentar algo sensible al usuario si se atrapó una COMException.

+0

Particularmente dado que el registro es mucho más complicado de lo que parece, debido a varias capas de emulación, 32/64-bit y así sucesivamente. –

2

Verificar si existe clave utilizando Microsoft.Win32.RegistryKey

var key = Microsoft.Win32.RegistryKey.OpenBaseKey(
      Microsoft.Win32.RegistryHive.ClassesRoot, 
      Microsoft.Win32.RegistryView.Default) 
      .OpenSubKey("Interface") 
       //replace with your COM object GUID 
      .OpenSubKey("{a3560000-0000-0000-c63b3-000000cbadf0000}"); 

     return key != null; 
4

suponiendo que conoce el CLSID de la DLL COM, sólo puede comprobar si hay una clave con la que CLSID en HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component} o HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component} (Wow6432Node => 32-bit COM registrada en una máquina de 64 bits)

por ejemplo,

private bool IsAlreadyRegistered() 
{ 
    using (var classesRootKey = Microsoft.Win32.RegistryKey.OpenBaseKey(
      Microsoft.Win32.RegistryHive.ClassesRoot, Microsoft.Win32.RegistryView.Default)) 
    { 
     const string clsid = "{12345678-9012-3456-7890-123456789012}"; 

     var clsIdKey = classesRootKey.OpenSubKey(@"Wow6432Node\CLSID\" + clsid) ?? 
         classesRootKey.OpenSubKey(@"CLSID\" + clsid); 

     if (clsIdKey != null) 
     { 
      clsIdKey.Dispose(); 
      return true; 
     } 

     return false; 
    } 
} 
+1

Realmente aprecio su excelente código. Muchas gracias ! –

Cuestiones relacionadas