Проверьте, если DLL уже зарегистрирована - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь использовать функцию GetClassFile, передавая имя DLL в качестве параметра и ожидая, что функция вернет CLSID.Затем, используя CoCreateInstance, я мог бы проверить, зарегистрирована ли dll или нет.

Я не могу получить действительный возврат для GetClassFile() даже при передаче зарегистрированной DLL.

HRESULT hr = GetClassFile((LPCOLESTR) "C:\\Program Files\\Common Files\\Microsoft Shared\\DAO\\dao360.dll", &clsid);

1 Ответ

1 голос
/ 08 марта 2012

GetClassFile() не имеет отношения к COM.Если вы прочитаете документацию , передача имени файла DLL не приведет к созданию COM CLSID, который вы можете передать CoCreateInstance().Это всегда будет с ошибкой MK_E_INVALIDEXTENSION.

Что вы можете сделать, это вызвать LoadTypeLib(), чтобы проверить, реализует ли DLL библиотека типов и получить ее интерфейс ITypeLib.В случае успеха вы можете вызвать его методы GetTypeInfoCount(), GetTypeInfoType() и GetTypeInfo(), чтобы найти и извлечь интерфейс ITypeInfo для каждого объекта TKIND_COCLASS.Для каждого ITypeInfo вы можете вызвать его GetTypeAttr() метод для получения CLSID.После этого вы можете позвонить CoCreateInstance() с запросом интерфейса IUnknown для проверки регистрации (или вы можете просто вручную проверить ключ HKEY_CLASSES_ROOT\CLSID\<clsid> реестра).

...