[英]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.