CreateInstance例程的模板函数

时间:2012-02-09 08:05:12

标签: c++ com

我创建了以下创建接口实例的方法。

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;
}

我想知道它为什么不能正常工作。感谢。

2 个答案:

答案 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>();