如何将LPUNKNOWN pDlg类型转换为我们的类类型。是dynamic_cast很好吗? 例如:myclass * myclass_obj; myclass_obj = dynamic_cast< myclass *> PDLG; 请帮帮我。
答案 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机制,并且不需要运行时类型信息,并不是所有平台都支持这种信息。