2010-04-22 51 views

回答

1

如果從.ocx文件本身的意思是,你可能有兩個選擇:

  1. 閱讀從.OCX類型庫,解析出對象和接口的UUID,看看他們都存在於註冊表下的HKCR \ CLSID,HKCR \ TypeLib等。

  2. 循環遍歷註冊表中HKCR \ CLSID中的所有註冊對象,並查看它們中是否有任何引用.ocx作爲它們的InprocServer32引用。您可能需要在讀取的路徑上執行路徑和環境變量擴展,以便測試匹配。

第一種方法也不一定會告訴你,如果它是安裝在同一版本的.OCX,雖然(儘管你可以檢查每個磁盤上的路徑)。第二個不幸的是會很慢。

這可能是最簡單的重新註冊.ocx我想。

1

您可以檢查ocx的clsid是否在HKEY_CLASSES_ROOT下。 這是我用來檢測運行時檢查指定的ocx是否已註冊的簡單代碼。

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