将VB6类型转换为VB.NET数组结构

问题描述:

我尝试将这些VB6类型转换为VB.NET世界。将VB6类型转换为VB.NET数组结构

Type TRACK_DATA 
    Dim reserved As Byte 
    Dim Control As Byte 
    Dim Tracknumber As Byte 
    Dim reserved1 As Byte 
    Dim address As Long 
End Type 

Type CDTOC 
    Dim Length As Long 
    Dim FirstTrack As Byte 
    Dim LastTrack As Byte 
    Dim Tracks(100) As TRACK_DATA 
End Type 

当前的尝试悲惨的失败了

<System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, Size:=8)> 
Structure TRACK_DATA 
    Public reserved As Byte 
    Public Control As Byte 
    Public Tracknumber As Byte 
    Public reserved1 As Byte 
    Public address As UInteger 
End Structure 

<System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, Size:=806)> 
Structure CDROM_TOC '4 + 1 + 1 + 800 = 806 
    Public Length As UInteger 
    Public FirstTrack As Byte 
    Public LastTrack As Byte 
    Public Tracks() As TRACK_DATA 
End Structure 
... 
Dim MyCD As CDTOC 
ReDim MyCD.Tracks(100) 

任何提示如何做到这一点?

它传递参数,并让他们回到外部DLL,所以我用编组站但Marshal.SizeOf(MyCD)返回错误值(12)如果我不使用互操作规模,并韦尔普,与StructureToPtr所有attemps结束错误。下面

的代码,如果任何使用的理解:

Toc_len = Marshal.SizeOf(MyCD) 
    Dim Toc_ptr As IntPtr = Marshal.AllocHGlobal(CInt(Toc_len)) 

    'open the drive 
    ... 

    'access to the TOC 
    DeviceIoControl(hFile, IOCTL_CDROM_READ_TOC, IntPtr.Zero, 0, Toc_ptr, Toc_len, BytesRead, IntPtr.Zero) 

    'copy back the datas from unmanaged memory 
    'fails here ! 
    MyCD = Marshal.PtrToStructure(Toc_ptr, CDTOC.GetType()) 
+0

对于记录,VB6的'Long'通常映射到'Integer',而不是'UInteger'(除非DLL需要UInts,就是这样)。 –

有看起来是一些相当广泛的讨论在这里的链接(包括示例代码): https://social.msdn.microsoft.com/Forums/en-US/3df9e61d-440f-4bea-9556-b2531b30e5e6/problem-with-deviceiocontrol-function?forum=vblanguage

你的结构就是缺少Tracks成员的属性来告诉编译器它是一个内联的100个成员数组。

从链接:

<StructLayout(LayoutKind.Sequential)> _ 
Structure CDROM_TOC 
    Public Length As UShort 
    Public FirstTrack As Byte 
    Public LastTrack As Byte 
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> _ 
    Public TrackData() As TRACK_DATA 
End Structure 

(该链路还包括几个在结构便利功能,这我在这里省略)

+0

啊! 'MashalAs SizeConst'是诀窍。顺便说一句,在链接的讨论是一个很好的发现,谢谢! –