Как я могу найти в Visual C ++, зарегистрирован файл OCX (например, flash.ocx) или нет? - PullRequest
5 голосов
/ 22 апреля 2010

Как я могу найти в Visual C ++, зарегистрирован файл OCX (например, flash.ocx) или нет?

Ответы [ 2 ]

1 голос
/ 12 марта 2014

Вы можете проверить, находится ли clcid ocx под 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.
}
1 голос
/ 21 сентября 2012

Если вы имеете в виду из самого файла .ocx, у вас, вероятно, есть два варианта:

  1. Считать библиотеку типов из .ocx, проанализировать UUID объекта и интерфейса и посмотреть, существуют ли все они в реестре в HKCR \ CLSID, HKCR \ TypeLib и т. Д.

  2. Перебрать все зарегистрированные объекты в HKCR \ CLSID в реестре и посмотреть, ссылаются ли какие-либо из них на ваш .ocx как на ссылку InprocServer32. Вам может потребоваться выполнить расширение пути и переменных среды на пути, который вы прочитали, чтобы проверить соответствие.

Первый метод не обязательно сообщит вам, если установлена ​​та же версия .OCX (хотя вы можете проверить путь на диске для каждого). Второй, к сожалению, будет очень медленным.

Наверное, проще всего просто перерегистрировать .ocx, я думаю.

...