gpt4 book ai didi

c# - 将结构数组从 C++(COM) 传递到 C#

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:24 25 4
gpt4 key购买 nike

我正在尝试将结构数组从 C++(COM) 传递到 C#

        //C++ definition
//MyStruct being a COM Visible Structure
HRESULT GetArrofStruct([in,out] LONG* count, [out,size_is(,*pnCnt)] MyStruct** ppArr);

//C# definition
void GetArrofStruct(ref int Count,out IntPtr outPtr);

//I use the Function Something like this in C#

IntPtr buffer = IntPtr.Zero;

int Count;

GetArrofStruct(ref Count,out buffer);
MyStruct[] arrayManaged = new MyStruct[Count];

for (int i = 0, nElemOffs = (int)buffer; i < Count; i++)
{
ru[i] = (MyStruct)Marshal.PtrToStructure((IntPtr)nElemOffs, typeof(MyStruct));
nElemOffs += Marshal.SizeOf(typeof(MyStruct));
}

在 for 循环中,第一个元素被正确编码,对于第二个元素,我得到一个 AccessViolation。

在 C++ 端,数组似乎已正确填充。(通过调试验证)。

最佳答案

好吧,你的问题出在 (int)buffer cast 中。运算符 + 在 int 和 IntPtr 上是不同的。请看以下内容:

   for (int i = 0; i < Count; i++)
{
IntPtr newPtr = buffer + i * sizeof(typeof(MyStruct));
ru[i] = (MyStruct)Marshal.PtrToStructure(newPtr, typeof(MyStruct));
}

我没有测试过这个,我不知道你的 IntPtr 的内容是否正确和正确分配,但这是你应该如何遍历结构数组。

至于编码问题,编码是由IDL定义的,所以请检查你的数组定义。我不确定([out] 数组总是让我感到困惑),但在我看来你的一维太多了。请尝试以下操作(如果正确请告诉我):

[out,size_is(pnCnt)] MyStruct** ppArr

[out,size_is(*pnCnt)] MyStruct* ppArr

关于c# - 将结构数组从 C++(COM) 传递到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com