VB.NET P/Invoke たとえば、 midiOutGetDevCaps
ひさびさに VB.NETをさわって引っかかったのでメモ。
MSDN - MIDIOUTCAPS
http://msdn.microsoft.com/ja-jp/library/ms711619.aspx
MSDN - midiOutGetDevCaps
http://msdn.microsoft.com/ja-jp/library/cc410545.aspx
MMSYSERR_INVALPARAM
指定されたポインタまたは構造体は無効です。
から抜けられなかった。エラーメッセージを偏って解釈して構造体の宣言に目がいってたけども、どうやら Declare宣言の関数引数/戻り値部分に問題があったようだ。むぅ
戻り値がInteger型でなくLong型(NGケース)とかだと、確かオーバーフローエラーが発生する。
---------------------------------------
NG<>は表示の都合上、全角
Private Declare Function midiOutGetDevCaps Lib "winmm" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As Long, ByRef lpCaps As MIDIOUTCAPS, ByVal uSize As Long) As Long
Private Declare Function midiOutGetDevCaps Lib "winmm" (ByVal uDeviceID As Long, ByRef lpCaps As MIDIOUTCAPS, ByVal uSize As Long) As Long
---------------------------------------
OK<>は表示の都合上、全角
Private Declare Function midiOutGetDevCaps Lib "winmm" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As Integer, <MarshalAs(UnmanagedType.Struct)> ByRef lpCaps As MIDIOUTCAPS, ByVal uSize As Integer) As Integer
---------------------------------------
ちなみに構造体宣言部
構造体のwMidのShort型をInteger型とかにすると、例えば、szPname(デバイス名)の頭が欠けたりする。
Public Const MAXPNAMELEN = 32
<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
---------------------------------------
■ サンプルMain(書きかけ
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Dim MIDIDeviceCnt As Integer = midiOutGetNumDevs() - 1
Dim MIDIOutDeviceInfo As New MIDIOUTCAPS
Dim ret As Integer
For index As Integer = 0 To MIDIDeviceCnt
ret = midiOutGetDevCaps(index, MIDIOutDeviceInfo, Marshal.SizeOf(MIDIOutDeviceInfo))
Next


Recent Comments