CreateInstance例程的模板函数

Template function for CreateInstance routines

本文关键字:函数 例程 CreateInstance      更新时间:2023-10-16

我制作了以下方法来创建接口实例。

static IFBIndexItem* CreateFBIndexItemPtr()
{
    IFBIndexItemPtr pFBComWrapper;
    HRESULT hr = pFBComWrapper.CreateInstance(__uuidof(FBIndexItem));
    if (FAILED(hr)) {
        throw new _com_error(hr);
    }
    return pFBComWrapper;
}

它工作得很好,但由于我有多个接口,我想创建一个模板方法。所以这里是结果方法,但它抛出"Class not registered"异常。

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

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

问题是将接口的UUID代替类id传递到CreateIsntance()中。

当然,CreateInstance()在这样使用时会失败——(通常)没有与接口id相同的COM公开类。此外,多个类可以实现同一个接口,因此您自然希望能够为同一接口传递不同的类id。

因此,函数中需要有两个参数——接口和类id(或者可以使用__uuidof从中获取类id的类本身)。

此外,您的代码中存在严重的所有权问题。函数返回从智能指针中提取的原始指针,该指针在函数返回时被销毁。这可能会导致对象被释放,指针变得悬空。

这是工作代码,根据sharptoth的答案似乎是正确的。

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