C# 无法使SAFEARRAY与互操作一起工作
我有一个ATLCOM服务器,接口的方法是C# 无法使SAFEARRAY与互操作一起工作,c#,c++,interop,atl,C#,C++,Interop,Atl,我有一个ATLCOM服务器,接口的方法是 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,因此可以使用本机阵列。然后我从
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)
其中输入已经被分配,并由我的C程序中的另一个COM对象填充。现在,当我调用C++包装器时,我有一个用于我的SAFAREAR的BADPTR,并且从CWrAPER中调用到一个后续的COM对象::运行失败,因为数组没有使它进入最终的DLL。它显示为未分配。有人知道我做错了什么吗?谢谢
编辑:我应该声明数组在C中看起来很好
EDIT2:调试器显示IDispatch*=0x0000000,5,0x0000000{lpvtbl=0xblahblah},。。。。
所以看起来我的一些信息已经到达了那里。普通的C数组与安全数组不同。我认为你必须自己做:
[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.allocTaskMem创建内存。填写所有数据,然后传递 我能找到的所有文档似乎都表明互操作层应该将数组封送到IDL中定义的safearrayIs\u MyDataType?如果没有,你应该在那里做。另一件事:你为什么需要nSize?SAFEARRAY保持自己的大小。