如果未注册com dll,如何防止崩溃

时间:2009-01-27 12:48:25

标签: c++ com

从一些旧的c ++代码中我试图使用一个com dll,它在注册dll时工作正常,但是如果dll没有注册则会很糟糕。

//初始化COM。 HRESULT hr = CoInitialize(NULL);

IGetTestPtr ptest(__ uuidof(tester));

“使用dll中的方法”

//取消初始化COM。 CoUninitialize();

在调用IGetTestPtr ptest(__ uuidof(tester))之前,无论如何检查dll是否已注册?

或者防止崩溃的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

在对象上调用CreateInstance将返回一个可以成功测试的HRESULT:

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

这假设您使用Visual Studio在类型库周围创建了一个接口包装器,其中COM Smart Pointers在接口中使用(这为您提供了CreateInstance方法)。

答案 1 :(得分:2)

如果DLL已注册,则HKCR/CLSID/{uuidof(tester)}中有一条记录(大括号确实很重要)。

实际上,如果不是,则CoCreateInstance将返回错误。使用指针前检查此错误。

答案 2 :(得分:2)

如果未注册COM类,则CoCreateInstance将返回REGDB_E_CLASSNOTREG。您应该使用SUCCEEDED()或FAILED()宏检查一般成功或失败。您还需要正确创建对象 - 请参阅MDSN introduction to 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;

答案 3 :(得分:0)

如果我没记错的话,这个“#import”样式的COM框架会抛出异常。在代码周围添加一个try-catch块。谷歌告诉我,例外是_com_error类型。

除非你在#import上转义参数以防止这种情况,否则所有失败的COM调用都会抛出异常。您将不得不关闭它(#import“原始”接口,我认为这样做 - 查看#import文档)或真正熟悉这些异常。