指向对象COM方法参数的指针

时间:2015-11-04 11:05:53

标签: c# c++ com interop atl

我是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'无法由运行时封送程序封送。因此,这些参数将作为指针传递,并且可能需要不安全的代码来操作。"

为什么会这样?

0 个答案:

没有答案