現在、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に書き込んだしだいです。