如何将struct(不是指向struct的指针)传递给ruby中的Win32API调用?

时间:2017-06-23 12:52:35

标签: ruby struct ffi

我正在尝试将结构传递给ruby中的Win32API调用。

我该怎么做?

结构不是指针。所以我不能编写如下代码:

require 'win32api'
get_std_handle = Win32API.new('kernel32.dll',"GetStdHandle",['I'],'I')
h = get_std_handle.call(-11) # STD_OUTPUT_HANDLE

# ['I','P'] is wrong. COORD is not a pointer. it's a structure.
set_console_cursor_position = Win32API.new('kernel32.dll',"SetConsoleCursorPosition",['I','P'],'I') 
p = [10,10].pack('S*')
set_console_cursor_position.call(h,p)
puts "hello" # since above code is wrong, this will not printed at position 10,10

所以问题是:如何将结构(不是指针)传递给Win32API调用?

1 个答案:

答案 0 :(得分:1)

RubyDoc的人们已经列出了他们的Win32Console gem的源代码,它使用了这个,

def SetConsoleCursorPosition( hConsoleOutput, col, row )
  @SetConsoleCursorPosition ||= Win32API.new( "kernel32", "SetConsoleCursorPosition", ['l', 'p'], 'l' )
  dwCursorPosition = (row << 16) + col
  @SetConsoleCursorPosition.call( hConsoleOutput, dwCursorPosition )
end

阅读How to pass structures as parameters to Win32API in Ruby (Array#pack and Array#unpack)也可能为你提供一些启示。

不幸的是,我不确定你的后续评论的答案,也许你可能会问另一个问题,或者知道可以在这里添加另一个答案或评论的人,或者确实可以随意编辑这个答案来添加那个信息。