LPUNKNOWN的类型转换

Type conversion for LPUNKNOWN

本文关键字:类型转换 LPUNKNOWN      更新时间:2023-10-16

如何将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机制内,并且不需要运行时类型信息,这在所有平台上都不支持。