CreateInstance例程的模板函数
Template function for CreateInstance routines
我制作了以下方法来创建接口实例。
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>();
相关文章:
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- c++类声明时,相同的例程,不同的成员变量类型
- C++为线程工作动态地分割例程
- 子例程,不使用 pow,并带有参数和返回
- 直接在RcppArmadillo中调用LAPACK例程
- 如何将C++子例程链接到 x86 程序集程序?
- PX 转换例程编译问题
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 只允许授权代码调用库中的例程
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- C++ 我的函数在我的 Image 类中工作,但不在主例程中工作
- 复制文件时如何调用取消?(使用复制文件 ex 函数和复制进度例程回调函数)
- 将类对象指针传递给默认构造函数(C 子例程)
- 如何从子例程函数获取到 main 函数的返回值
- 如何使派生类函数作为线程的启动例程?
- 将C++函数指针传递到Fortran子例程
- 在主程序或函数子例程中使用数组的差异
- CreateInstance例程的模板函数
- 作为中断服务例程的静态模板成员函数
- 初始化头文件中声明的模板构造函数/例程