2017-08-23 11 views
3

私はそれらの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)は、iがInteropサイズ、および、welpを使用しない場合は、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'は通常にマッピングされていますDLLがUIntsを期待している場合を除き、 'UInteger'ではなく' Integer'です。 –

答えて

9

こちらのリンクで(例えば、コードを含む)いくつかのかなり広範な議論があるように見えます: 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'はトリックです。 Btwのリンクでの議論は素晴らしい発見です、ありがとう! –

関連する問題