我是COM / ATL的新手。无法理解如何处理C#中的** COM方法参数。
例如。假设我有一个接口文件Element.idl:
interface IElement : IDispatch
{
[propget,
id(1),
helpstring("Gets the Root instance object")
]
HRESULT InstanceRoot([out, retval]IRoot** ppRoot);
}
IRoot
也是COM接口
interface IRoot : IDispatch
{
[id(1),helpstring("Very important thing")]
HRESULT Foo();
}
IElement::InstanceRoot
getter实现如下所示:
STDMETHODIMP CElementObject::get_InstanceRoot(IRoot** ppRoot)
{
*ppRoot = NULL;
CComRoot* pRoot = CComRoot::GetRoot(); //Root is a singleton
if (pRoot)
{
pRoot->QueryInterface(IID_IRoot, (void**)ppRoot);
}
}
return NOERROR;
}
在C#中,我将IntPtr
作为Element.InstanceRoot
属性类型。如何将此IntPtr
转换为对Root
对象的引用(因为我需要从我的C#代码中调用Root.Foo
方法)?
// Doesn't work. Can not convert System.IntPtr to MyLib.Root
Root tempRoot = someElement.InstanceRoot as Root;
更新:忘记提及我收到编译错误:
"至少有一个' Element.get_InstanceRoot'无法由运行时封送程序封送。因此,这些参数将作为指针传递,并且可能需要不安全的代码来操作。"
为什么会这样?