从一些旧的c ++代码中我试图使用一个com dll,它在注册dll时工作正常,但是如果dll没有注册则会很糟糕。
//初始化COM。 HRESULT hr = CoInitialize(NULL);
IGetTestPtr ptest(__ uuidof(tester));
“使用dll中的方法”
//取消初始化COM。 CoUninitialize();
在调用IGetTestPtr ptest(__ uuidof(tester))之前,无论如何检查dll是否已注册?
或者防止崩溃的正确方法是什么?
答案 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文档)或真正熟悉这些异常。