我只是尝试进行一些基本的Windows调用,以便从MIDI输入设备(键盘)打印信息。这两个调用似乎可以工作,但对midiInOpen和midiInStart的前两个调用返回MMSYSERR_NOMEM和MMSYSERR_INVALHANDLE。我相信这与ptr = FFI::MemoryPointer.new(:pointer)有关,但我对它的了解还不够深入。任何帮助都是非常感谢的。
require 'ffi'
module MIDI; end
module MIDI::Input
extend FFI::Library
ffi_lib 'winmm'
ffi_convention :stdcall
callback :midiInProc, [ :pointer, :uint, :int, :int, :int ], :void
attach_function :midiInOpen, [ :pointer, :uint, :midiInProc, :int, :int ], :int
attach_function :midiInClose, [ :long ], :int
attach_function :midiInStart, [ :long ], :int
attach_function :midiInStop, [ :long ], :int
attach_function :midiInReset, [ :long ], :int
MidiInProcCallback = Proc.new do |hmidiin, wmsg, dwintance, dwparam1, dwparam2|
p hmidiin, wmsg, dwintance, dwparam1, dwparam2
end
end
require 'pp'
ptr = FFI::MemoryPointer.new(:pointer)
p MIDI::Input.midiInOpen(ptr, 0, MIDI::Input::MidiInProcCallback, 0, 0)
p MIDI::Input.midiInStart(ptr.read_long)
trap("INT") do
p MIDI::Input.midiInStart(ptr.read_long)
p MIDI::Input.midiInClose(ptr.read_long)
p ptr.free
exit
end
loop {}发布于 2011-01-07 14:54:39
没有确切的答案,因为您的代码看起来基本上是正确的,但我怀疑传递给midiInOpen()的dwFlags (最后一个参数)才是问题所在。看一下http://msdn.microsoft.com/en-us/library/dd798458(v=vs.85).aspx,它似乎需要非零。
尝试在winmm头文件中查找CALLBACK_FUNCTION的值,并在模块中声明一个类似的常量,然后将其用作标志参数。
在http://powersdr-iq.googlecode.com/svn/trunk/Source/Console/midi.cs上有一个C#包装器,它可能是其他人使用Invoke P/Invoke接口包装相同的C#的有用示例。
您对midiInOpen和回调的签名略有错误(但不会导致此问题)。它们应该是:
callback :midiInProc, [ :pointer, :uint, :pointer, :pointer, :pointer ], :void
attach_function :midiInOpen, [ :pointer, :uint, :midiInProc, :pointer, :int ], :int即use : API文档使用DWORD_PTR的地方的指针
发布于 2016-12-18 06:44:16
看一看https://github.com/arirusso/midi-winmm/blob/master/lib/midi-winmm/map.rb
噢!这是你们的一部分。凉爽的。它起作用了。
我知道这在windows中是有效的,因为我已经尝试过了。我最大的愿望是找到来自微软的winmm.dll应用编程接口的文档。多亏了user186057回答了你的问题,我想我已经找到了。
谢谢。
https://stackoverflow.com/questions/4622922
复制相似问题