Как предотвратить сбой, если com dll не зарегистрирован - PullRequest
2 голосов
/ 27 января 2009

Из какого-то старого кода на c ++, который я пытаюсь использовать, dll работает нормально, когда dll зарегистрирована, но вылетает, если dll не зарегистрирована.

// Инициализировать COM. HRESULT hr = CoInitialize (NULL);

IGetTestPtr ptest (__uuidof (тестер));

«Использовать метод из dll»

// Неинициализировать COM. CoUninitialize ();

В любом случае, нужно ли проверить, была ли dll зарегистрирована, перед вызовом IGetTestPtr ptest (__uuidof (tester))?

Или как правильно предотвратить сбой?

Ответы [ 4 ]

3 голосов
/ 27 января 2009

Вызов CreateInstance для вашего объекта вернет HRESULT, который можно проверить на успех:

IGetTestPtr p = null; 
HRESULT hRes = p.CreateInstance( __uuidof(tester) );
bool bSuccess = SUCCEEDED(hRes);

Предполагается, что вы создали интерфейсную оболочку для вашей библиотеки типов с помощью Visual Studio, где в интерфейсе используются смарт-указатели COM (это дает вам метод CreateInstance).

2 голосов
/ 27 января 2009

Если класс COM не зарегистрирован, CoCreateInstance вернет REGDB_E_CLASSNOTREG. Вы должны проверить общий успех или неудачу, используя макросы SUCCEEDED () или FAILED (). Вам также необходимо правильно создать объект - см. MDSN для введения в COM . Например:

HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
    IGetTestPtr ptr = NULL;
    hr = CoCreateInstance(CLSID_MyObjectNULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, ptr)
    if (SUCCEEDED(hr))
    {
        Do something with your COM object
        ...

        // Don't forget to release your interface pointer or the object will leak
        ptr->Release();
    }

    hr = CoUninitialize();
}
return hr;
2 голосов
/ 27 января 2009

Если DLL зарегистрирована, в HKCR/CLSID/{uuidof(tester)} есть запись (фигурные скобки имеют значение).

На самом деле, если это не так, CoCreateInstance вернет ошибку. Проверьте эту ошибку перед использованием указателя.

0 голосов
/ 27 января 2009

Если я правильно помню, этот COM-каркас в стиле "#import" генерирует исключения. Добавьте блок try-catch вокруг кода. Google сообщает, что исключения относятся к типу _com_error.

Если вы не измените параметры в #import, чтобы предотвратить это, все сбойные вызовы COM будут вызывать исключения. Вам придется отключить это (#import "raw" интерфейсы, я думаю, это возможно - посмотрите на документы #import) или по-настоящему ознакомиться с этими исключениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...