为LPUNKNOWN键入转换

时间:2015-10-20 05:22:55

标签: c++ types type-conversion

如何将LPUNKNOWN pDlg类型转换为我们的类类型。是dynamic_cast很好吗? 例如:myclass * myclass_obj; myclass_obj = dynamic_cast< myclass *> PDLG; 请帮帮我。

2 个答案:

答案 0 :(得分:3)

LPUNKNOWN是IUnknown pointer instance。 - 这是一个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对象的正确语义。

答案 1 :(得分:0)

据推测,你的课程是用ATL编写的?

在这种情况下,我通常做的是声明这样的私有界面:

.data
const dw 5   ; now a word

.code
mov ax,1000
cwd          ; sign-extend ax into dx
idiv const
; quotient is in ax, remainder in dx

然后在我的类中实现该接口:

interface __declspec(uuid("*some GUID here*")) ICheckMyClass : IUnknown
{
    STDMETHOD_(MyClass*,GetMyClass)() PURE;
};

最后,您需要从IUnknown *安全地投射:

class MyClass
    : CComObjectRootEx ...
    , private ICheckMyClass
{
...
private:
    STDMETHODIMP_(MyClass*,GetMyClass)() { return this; }

    BEGIN_COM_MAP(MyClass)
        ...
        COM_INTERFACE_ENTRY(ICheckMyClass)
    END_COM_MAP()
};

这看起来似乎很冗长,但对我而言,它有利于保持标准的COM和ATL机制,并且不需要运行时类型信息,并不是所有平台都支持这种信息。