我正在尝试将结构传递给 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 调用?
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
阅读如何将结构作为参数传递给 Ruby 中的 Win32API(Array#pack 和 Array#unpack)也可能对您有所启发。
不幸的是,我不确定您的后续评论的答案,也许您可以将其作为另一个问题提出,或者知道的人可以在此处添加另一个答案或评论,或者确实可以随意编辑此答案以添加该信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句