我正在尝试将结构传递给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调用?
答案 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)也可能为你提供一些启示。
不幸的是,我不确定你的后续评论的答案,也许你可能会问另一个问题,或者知道可以在这里添加另一个答案或评论的人,或者确实可以随意编辑这个答案来添加那个信息。