Каковы параметры Ruby Win32API |Как передать нулевой указатель? - PullRequest
2 голосов
/ 12 ноября 2011

Я знаю следующее:

  • 'L' - Long
  • 'P' - Указатель
  • 'I' - Целое число
  • 'V' - Void

Моя проблема в том, что я не могу передать нулевой указатель при выполнении вызова API.Например: ['L', 'P', 'L'] -> api.call(0, nil, 0) :: ArgumentError: Null pointer given.Мой вопрос: есть ли еще типы параметров, о которых я не знаю, и что мне нужно сделать, чтобы передать нулевой указатель в качестве параметра метода?

Фон

Я искал в Интернетедля собственных примеров программирования на Ruby приложений на основе WinForms.Я рассмотрел дополнение .NET к Ruby, известное как IronRuby, для простоты в кодировании (пытаясь избежать wxRuby, а также вентилятора .NET), но сначала я хочу иметь возможность сначала явно кодировать на чистом Ruby.

Теперь я успешно смог реализовать большинство адресов, которые я тестировал в объекте user32.dll, таких как:

api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
# or
api = Win32API.new('user32', 'MessageBeep', ['L'], 'I')

.. но я не могу выполнить CreateWindow или CreateWindowEx без нуляпараметры.Если это поможет, я нашел, как это сделать в Python здесь (под WinAPI).

Использование Win32API: msdn.microsoft.com/en-us/library/ff381397 (v = VS.85) .aspx

[РЕДАКТИРОВАТЬ]
Ну, я думаю, что я, возможно, только что решил свою собственную проблему с этой ссылкой (предупреждение: можетсодержит неприемлемое содержание) : [ссылка]

Я больше использовал этот форум в качестве ссылки и немного повозился с собой:
createwindow = Win32API.new("user32","CreateWindowEx",'lpplllllllll','l')
showwindow = Win32API.new('user32','ShowWindow',%w(l l),'l')

hWND = createwindow.call((0x00000100|0x00000200),"static", "Window Title",((0x4000000|0x80000000|0)|0x02000000),0,0,600,400,0,0,0,0)
showwindow(hWND, 1)

Единственное, что происходит после отображения «окна», это сбой ... и это могло произойти из-за неправильной обработкиНо я счастлив, что получил его на работу (немного)!Просто надо разобраться с остальными ...

Ответы [ 3 ]

4 голосов
/ 06 января 2013

Вместо использования Win32API (который, как мне кажется, построен поверх малоизвестного и мало используемого модуля DL), вы можете найти лучший пробег, используя новый и улучшенный модуль FFI.

Вот как:

  • (1) Получите ffi:
    gem install ffi

  • (2) Затем попробуйте это:

require 'ffi'

module Win32
   extend FFI::Library
   ffi_lib 'user32'
   attach_function :messageBox, 
       :MessageBoxA,[ :pointer, :string, :string, :long ], :int
end

rc = Win32.messageBox(nil, "Hello Ruby user!", "FFI is easy", 0x40)

puts rc

Это кажется проще, чем решение, которое вы опубликовали в своем редактировании.

Примечание: нулевой указатель вместо Hwnd делает окно сообщения не имеющим владельцаwindow.


Вот несколько ссылок, которые могут помочь:
0 голосов
/ 10 апреля 2014
require 'ffi'

module Win32
  extend FFI::Library
  ffi_lib 'user32'
  attach_function( 
                  :messageBox, 
                    :MessageBoxA,
                      [ :pointer, :string, :string, :long ], 
                      :int
                 )
end

rc = Win32.messageBox(nil, "Hello Ruby user!", "FFI is easy", 0x40)

puts rc
0 голосов
/ 12 ноября 2011

Я не проверял это, так как я не на Windows, но я думаю , что вы собираетесь использовать константу DL::NULL. Вы можете увидеть это в действии здесь (вторая до последней строки), и оно похоже на ваш вариант использования. Надеюсь, что это полезно!

...