VB.NET MIDIの出力デバイス名の取得について


かかと  2004-11-30 12:35:53  No: 86999  IP: [192.*.*.*]

現在、VB.NETでMIDIのソフトを作成しようとプログラムしているのですが、
MIDI出力デバイスのデバイス名を取得するためAPIのmidiOutGetDevCaps関数を使用して取得しようとしていますが、どうもうまく取得できません。(取得はできるのですが途中で切れます)

'取得プログラム
'APIで取得したデバイス名を出力ウィンドウにデバッグ出力する
<StructLayout(LayoutKind.Sequential)> Public Structure MIDIOUTCAPS
        Public wMid As Short
        Public wPid As Short
        Public vDriverVersion As Integer
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)> Public szPname As String
        Public wTechnology As Short
        Public wVoices As Short
        Public wNotes As Short
        Public wChannelMask As Short
        Public dwSupport As Integer
    End Structure
Public Declare Function midiOutGetDevCaps Lib "winmm.dll" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As Integer, <MarshalAs(UnmanagedType.Struct)> ByRef lpCaps As MIDIOUTCAPS, ByVal uSize As Integer) As Integer

    Public Function GetMidiOutDeviceName()
        Dim ret As Long
        Dim Caps As MIDIOUTCAPS
        Dim i As Integer

        MIDIDeviceCnt = midiOutGetNumDevs
        MIDIDeviceCnt = MIDIDeviceCnt - 1
        ReDim MidiOutDevices(MIDIDeviceCnt)
        For i = 0 To ret
            ret = midiOutGetDevCaps(i, Caps, Len(Caps))
            MidiOutDevices(i).Caps = Caps
            System.Diagnostics.Debug.WriteLine(Caps.szPname)
        Next
    End Function

このようなプログラムです。
この結果、出力ウィンドウで出力されるデバイス名は(MIDI出力デバイスが1つだけですので)
Microsoft GS Wav
となり、途中で切れているのです。
本来ならば
Microsoft GS Wavetable SW Synth
と出てほしいところなのですが・・・・

VB6で同等のプログラムを組み実行するときちんと
Microsoft GS Wavetable SW Synth
という結果が出るのですが。
マーシャリングというのでしょうか、このやり方がまずいのかどうか
一応、取得されるMIDIOUTCAPS構造体のszPnameメンバをchar型配列にして
見ましたが結果は同じで途中までしか取得できませんでした。

どなたか、解決方法をご存知の方がおられましたら、教えていただきたいと思いBBSに書き込んだしだいです。

編集 削除