LPUNKNOWN的类型转换
Type conversion for LPUNKNOWN
如何将LPUNKNOWN pDlg类型转换为我们的类类型。dynamic_cast可以吗?例如:myclass * myclass_obj;myclass_obj = dynamic_cast & lt;Myclass *> pdlg;
LPUNKNOWN是一个IUnknown指针实例。-这是一个COM对象。通常不会将COM接口强制转换回特定的c++类。相反,您可以在其上调用QueryInterface以获得所需的接口。
你没有说明你是如何或者从哪里得到LPUNKNOWN的,或者你的c++类的实例是如何起源成为那个实例的。知道这一点会有帮助的。
的例子:
IUnknown *pUnk = <initialized from where ever>
IFoo *pFoo = nullptr;
HRESULT hr = pUnk->QueryInterface(__uuidof(IFoo), &pFoo);
if (SUCCEEDED(hr))
{
pFoo->DoWhatever();
}
如果COM接口源自同一进程,则可以直接强制转换它,但这不是使用COM对象的正确语义。
想必您的类是使用ATL编写的?
在这种情况下,我通常做的是像这样声明一个私有接口:interface __declspec(uuid("*some GUID here*")) ICheckMyClass : IUnknown
{
STDMETHOD_(MyClass*,GetMyClass)() PURE;
};
,然后在我的类中实现这个接口:
class MyClass
: CComObjectRootEx ...
, private ICheckMyClass
{
...
private:
STDMETHODIMP_(MyClass*,GetMyClass)() { return this; }
BEGIN_COM_MAP(MyClass)
...
COM_INTERFACE_ENTRY(ICheckMyClass)
END_COM_MAP()
};
最后,需要从IUnknown*:
安全地强制转换的地方ATL::CComQIPtr<ICheckMyClass> check(pDlg);
MyClass* myClass=(check==0)?0:check->GetMyClass();
这可能看起来很冗长,但对我来说,它的好处是保持在标准的COM和ATL机制内,并且不需要运行时类型信息,这在所有平台上都不支持。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- LPUNKNOWN的类型转换