我创建了以下创建接口实例的方法。
static IFBIndexItem* CreateFBIndexItemPtr()
{
IFBIndexItemPtr pFBComWrapper;
HRESULT hr = pFBComWrapper.CreateInstance(__uuidof(FBIndexItem));
if (FAILED(hr)) {
throw new _com_error(hr);
}
return pFBComWrapper;
}
它工作正常,但由于我有多个接口,我想创建一个模板方法。所以这是结果方法,但它抛出"类没有注册"异常。
template<class T>
static T* CreateInterfacePtr()
{
_com_ptr_t <_com_IIID<T, &__uuidof(T)>> pFBComWrapper;
HRESULT hr = pFBComWrapper.CreateInstance(__uuidof(T));
if (FAILED(hr)) {
throw new _com_error(hr);
}
return pFBComWrapper;
}
我想知道它为什么不能正常工作。感谢。
答案 0 :(得分:2)
问题是您将接口的UUID代替类ID传递给CreateIsntance()
。
当然CreateInstance()
在使用时会失败 - 通常没有与接口具有相同ID的COM暴露类。此外,多个类可以实现相同的接口,因此您自然希望能够为同一个接口传递不同的类ID。
因此,您需要在函数中包含两个参数 - 接口和类ID(或者您可以使用__uuidof
从中获取类ID的类本身。)
此外,您的代码中存在严重的所有权问题。该函数返回从智能指针中提取的原始指针,该指针在函数返回时被销毁。这可能会导致对象被释放,指针变得悬空。
答案 1 :(得分:0)
所以这是工作代码,根据sharptooth的回答似乎是正确的。
template<class C, class T>
static C* CreateInterfacePtr()
{
_com_ptr_t <_com_IIID<C, &__uuidof(C)>> pInterface;
HRESULT hr = pInterface.CreateInstance(__uuidof(T));
if (FAILED(hr)) {
throw new _com_error(hr);
}
return pInterface.Detach();
}
呼叫:
CComPtr<IFBFileInfo> item = CreateInterfacePtr<IFBItem, FBItem>();