繁体   English   中英

无法使SAFEARRAY与Interop一起使用

[英]Can't get SAFEARRAY to work with Interop

我有一个ATL COM服务器,其中接口的方法是

STDMETHODIMP CWrapper::RUN(long iDataSize, SAFEARRAY** iData)

这个功能的MIDL看起来像

[id(1), helpstring("method RUN")] HRESULT RUN([in] long nSize, [in, size_is(nSize)] SAFEARRAY(_MyDataType*)* iData);

我使用tlbimp从该项目导入了tlb,因此可以使用本机数组。 然后,我从C#调用它,如下所示

 m_ServerWrapper.RUN(iInputs.Length,ref iInputs)

其中已经分配了Inputs,并从我的C#程序内部填充了另一个COM对象。 现在,当我调用C ++包装器时,我有一个用于我的safearray的BadPtr ,并且从CWrapper::RUN调用随后的COM对象失败,并且该数组未写入最终的dll。 它显示为未分配。 有人知道我在做什么错吗? 谢谢

编辑:我应该说过,数组在C#中看起来还不错。

EDIT2:调试器显示IDispatch* = 0x0000000 <Bad Ptr>, 5, 0x0000000 <Bad Ptr>({lpvtbl = 0xblahblah},... iData safearray IDispatch* = 0x0000000 <Bad Ptr>, 5, 0x0000000 <Bad Ptr>({lpvtbl = 0xblahblah},...所以看来我的某些信息正在到达那里。

普通的C#数组与SAFEARRAY不同。 我认为您必须自己制作:

[StructLayout(LayoutKind.Sequential)]
struct SafeArray
{
    public ushort   dimensions;  
    public ushort   features;    
    public uint     elementSize; 
    public uint     locks;       
    public IntPtr   dataPtr;     
    public uint     elementCount;
    public int      lowerBound;  
}

然后使用Marshal.AllocCoTaskMem()创建内存。 填写所有数据,然后将其传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM