Windows2000にVisualBasic.NET Standardをインストールして3ヶ月の初心者です。MIDIデバイスを直接操作したくて見様見真似でこのようにしましたが、midiOutがオープンできなくてお手上げ状態です。
Private Declare Function midiOutOpen Lib "winmm.dll" (ByVal _
lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback _
As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Dim hMid As Long
Dim ret As Long
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
ret = midiOutOpen(hMid, -1, 0, 0, 0)
End Sub
retには11が戻ります。
MIDIデバイスはソフトシンセとUSB対応のものを使っています。
midiOutGetNumDevs()では正常にデバイスの数を返してきます。
MCIでのMIDIファイル再生も問題なし。
市販のシーケンスソフトもでも問題ありません。
どうしてもretが0になってくれなくてお手上げ状態です。
何か根本的な見落としがあるのでしょうか。
よろしくお願いします。
とりあえずAs LongとなっているところをAs Integerにしてみては?
旧VBのLongは32ビット整数で、VB.NETでの32ビット整数はIntegerです。
よねKENさん、有難うございます。
質問を書いた後すぐにLongをIntegerにするという事を知って、整数は全てIntegerに
してみましたがやはりダメでした。
第一引数がLPHMIDIOUT型 … と言うことは、ByRefなのでは。
midiOutOpen APIを使った事が無いので、合っているのかどうかはわかりませんが、
とりあえず、以下のようなコードを書いてみたら 0が返されました。参考になれば。
Public Delegate Sub MidiOutProc( _
ByVal hmo As IntPtr, _
ByVal hwnd As UInt32, _
ByVal dwInstance As Int32, _
ByVal dwParam1 As Int32, _
ByVal dwParam2 As Int32)
Private Declare Function midiOutOpen Lib "winmm" _
(ByRef lphMidiOut As IntPtr, _
ByVal uDeviceID As Int32, _
ByVal dwCallback As MidiOutProc, _
ByVal dwInstance As Int32, _
ByVal dwFlags As Int32) As Int32
Private hMid As IntPtr
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ret As Integer = midiOutOpen(hMid, -1, Nothing, 0, 0)
MessageBox.Show(ret.ToString())
End Sub
あっ、そっかぁ!
lphMidiOutは参照渡しだった。
ByRefにしたらすんなり0が返ってきました。
1ヶ月間のモヤモヤが吹っ飛びました。
魔界の仮面弁士さん、有難うございます!
ツイート | ![]() |