首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby FFI的帮助

Ruby FFI的帮助
EN

Stack Overflow用户
提问于 2011-01-07 14:05:40
回答 2查看 833关注 0票数 2

我只是尝试进行一些基本的Windows调用,以便从MIDI输入设备(键盘)打印信息。这两个调用似乎可以工作,但对midiInOpen和midiInStart的前两个调用返回MMSYSERR_NOMEMMMSYSERR_INVALHANDLE。我相信这与ptr = FFI::MemoryPointer.new(:pointer)有关,但我对它的了解还不够深入。任何帮助都是非常感谢的。

代码语言:javascript
复制
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 {}
EN

回答 2

Stack Overflow用户

发布于 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和回调的签名略有错误(但不会导致此问题)。它们应该是:

代码语言:javascript
复制
callback :midiInProc, [ :pointer, :uint, :pointer, :pointer, :pointer  ], :void

attach_function :midiInOpen, [ :pointer, :uint, :midiInProc, :pointer, :int ], :int

即use : API文档使用DWORD_PTR的地方的指针

票数 1
EN

Stack Overflow用户

发布于 2016-12-18 06:44:16

看一看https://github.com/arirusso/midi-winmm/blob/master/lib/midi-winmm/map.rb

噢!这是你们的一部分。凉爽的。它起作用了。

我知道这在windows中是有效的,因为我已经尝试过了。我最大的愿望是找到来自微软的winmm.dll应用编程接口的文档。多亏了user186057回答了你的问题,我想我已经找到了。

谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4622922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档