2010-04-22 8 views

risposta

1

Se vuoi dire dal file ocx in sé, probabilmente si sono due opzioni:

  1. leggere la libreria dei tipi dal OCX, analizzare le UUID degli oggetti e di interfaccia e vedere se tutto esistere nel registro HKCR \ CLSID, HKCR \ TypeLib ecc

  2. loop attraverso tutti gli oggetti registrati negli HKCR \ CLSID nel registro di sistema e vedere se qualcuno di loro riferimento vostra oCX come riferimento InprocServer32. Potrebbe essere necessario eseguire un'espansione delle variabili di percorso e di ambiente sul percorso che si legge per testare la corrispondenza.

Il primo metodo non necessariamente dire se è la stessa versione del .OCX installato, anche se (anche se è possibile verificare il percorso sul disco per ciascuno). Il secondo è, purtroppo, molto lento.

Probabilmente è più semplice registrare nuovamente l'ocx che penserei.

1

È possibile verificare se il clsid di ocx è in HKEY_CLASSES_ROOT. Ecco un semplice codice che uso per rilevare su runtime per verificare se un ocx specificato è registrato.

#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. 
} 
Problemi correlati