2010-04-22 11 views

Respuesta

1

Si quiere decir desde el propio archivo .ocx, usted probablemente tiene dos opciones:

  1. Lea la biblioteca de tipos desde el .ocx, omita los UUID de objeto y de interfaz y ver si todo existe en el registro en HKCR \ CLSID, HKCR \ TypeLib etc.

  2. Pasa por todos los objetos registrados en HKCR \ CLSID en el registro y mira si alguno de ellos hace referencia a tu .ocx como referencia de InprocServer32. Es posible que deba realizar la expansión de la ruta y la variable de entorno en la ruta que leyó para probar la coincidencia.

El primer método no necesariamente le dirá si es la misma versión de la .OCX instalado, aunque (aunque se puede comprobar la ruta en el disco para cada uno). El segundo desafortunadamente va a ser muy lento.

Probablemente, lo más simple sea volver a registrar el .ocx, creo.

1

Puede verificar si el clsid de la ocx está bajo HKEY_CLASSES_ROOT. Aquí hay un código simple que uso para detectar en tiempo de ejecución para verificar si un ocx especificado está registrado.

#include<windows.h> 
... 
//Check if an ocx is resisted, and push warning 
HKEY subKey = NULL; 
LONG ret = RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID\\{XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX}"), NULL, KEY_QUERY_VALUE|KEY_WOW64_32KEY, &subKey); 
//Note that some CLSID of versioned ocx is under HKEY_CLASS_ROOT\TypeLib\{XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX} 
if(ret != ERROR_SUCCESS) 
{ 
    TCHAR message[512]; 
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,ret,0,message,512,NULL); 
    CString msgStr = message; 
#ifdef DEBUG //Extra message on DEBUG mode 
    AfxMessageBox(msgStr.GetBuffer()); 
#endif 
    AfxMessageBox(_T("OCX not registered"), MB_OK); 
} 
else 
{ 
    AfxMessageBox(_T("OCX is registered"), MB_OK); 
    RegCloseKey(subKey); //Remember to close opened key handle. 
} 
Cuestiones relacionadas