arrays - 将带有数组的 VB6 类型转换为 VB.NET 结构

标签 arrays vb.net vb6 structure type-conversion

我尝试将那些 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,所以我使用 Marshalling 但如果我不使用 InterOp Size,Marshal.SizeOf(MyCD) 返回错误值 (12),而且,welp,所有使用 StructureToPtr 的尝试都以错误结束。

下面的代码,如果有任何帮助理解:

    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())

最佳答案

这里的链接似乎有一些相当广泛的讨论(包括示例代码): 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

(该链接还包括我在此处省略的结构中的几个便利功能。)

关于arrays - 将带有数组的 VB6 类型转换为 VB.NET 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841460/

相关文章:

vb6 - 如何强制 VB6 在没有断点的情况下从程序执行进入调试器?

vb.net - 在 VB.NET 中设置 WinForms UserControl 的命名空间

vb.net - 什么是从vb.net调用php文件的最快方法

c# - Handles 子句需要在包含类型或其 VB.net 中的一种基本类型中定义的 WithEvents 变量

VB6错误传播

arrays - 有没有比 F# 中的 append 更有效的向数组添加尾部的方法?

c++ - 整数比较不正确或不比较

python - 矩阵均值乘以标量向量

java - 数组树找到 parent 和他们的 parent 以及到根的最短路径

visual-studio - 虽然VB6 IDE无法通过Windows 10上的GetObject函数获取对象