gpt4 book ai didi

c++ - CreateInstance 例程的模板函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:27 27 4
gpt4 key购买 nike

我做了以下创建接口(interface)实例的方法。

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

它工作正常,但由于我有多个接口(interface),我想创建一个模板方法。所以这里是结果方法,但它抛出“类未注册”异常。

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

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

最佳答案

问题是您将接口(interface)的 UUID 代替类 ID 传递给 CreateIsntance()

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

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

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

关于c++ - CreateInstance 例程的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207283/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com