gpt4 book ai didi

c++ - 编码(marshal)处理结构(包含数组)作为返回值

转载 作者:行者123 更新时间:2023-11-28 06:42:39 25 4
gpt4 key购买 nike

结构的 C++ 代码如下:

typedef struct _a astruct;
struct _a {
BYTE fi, Sec, *D, *IIV, PV;
bool Visited;
};

和一个使用它的函数:

struct DoPDC(string *InitialData);

我想通过VB.NET来使用这个函数(包含在一个DLL中),所以我为该结构写了如下代码:

<StructLayout(LayoutKind.Sequential)> _
Public Structure astruct
Dim fi As Byte
Dim Sec As Byte
Dim D As Byte()
Dim IIV As Byte()
Dim PV As Byte
<MarshalAs(UnmanagedType.Bool)> Dim Visited As Boolean
End Structure

和函数声明:

    <DllImport("astr.dll", EntryPoint:="DoPDC", BestFitMapping:=False, CallingConvention:=CallingConvention.Cdecl, ThrowOnUnmappableChar:=True, CharSet:=CharSet.Ansi)> _
Public Function DoPDC(ByVal InitialData As String()) As <MarshalAs(UnmanagedType.Struct)> astruct
End Function

所以,我得到了一个悲惨的错误 MarshalDirectiveError,特别是 Method's type signature is not PInvoke compatible. 我以前从未见过这个错误,并且有很多不同的解决方案互联网,但没有人遇到过我的情况,我将一个字符串数组作为参数传递,返回一个包含更多数组的结构!

结果,我不知道哪里出了问题:参数、返回值、返回值里面的数组还是一起?我很困惑...因此,我的问题是:如何修改我的 VB.NET P/Invoke 代码,使其正常工作?

(请注意,我不可能更改 C++ DLL,因为它不是我的,因此,我没有代码...)

最佳答案

问题出在您对 DIIV 的定义中。您将它们声明为字节数组,但 P/Invoke 编码器不知道这些数组有多大;传递长度的指针到字节没有任何内在的东西。如果数组是可变长度的,那么 P/Invoke 编码器如何确定这个长度?如果它们始终具有已知的固定长度,那么您可以使用它,其中 N 是数组的固定长度:

<MarshalAs(UnmanagedType.LPArray, SizeConst = N)>

如果返回的数组具有动态大小,并且您可以在函数返回后以某种方式确定它,则将 DIIV 声明为 IntPtr 并使用 System.Runtime.InteropServices.Marshal 的方法提取数据。

如果指针指向它希望您释放的函数分配的内存,您将必须手动释放分配,这将涉及将这些指针发送回非托管函数以进行释放。

关于c++ - 编码(marshal)处理结构(包含数组)作为返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25671143/

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