2

私は次のことを知っています:

  • 'L'- 長いです
  • 'P'- ポインター
  • 'I'- 整数
  • 'V'- 空所

私の問題は、API 呼び出しを実行するときに null ポインターを渡すことができないことです。例: ['L', 'P', 'L'] -> api.call(0, nil, 0) :: ArgumentError: Null pointer given. 私の質問は次のとおりです。私が知らないパラメーターの型が他にもありますか?メソッドのパラメーターとして null ポインターを渡すにはどうすればよいですか?

バックグラウンド

WinForms ベースのアプリケーションのネイティブ Ruby プログラミングの例をインターネットで検索してきました。コーディングを簡単にするために、IronRuby として知られる Ruby への .NET の追加を検討しました (wxRuby を避けようとしており、.NET ファンでもあります) が、まずは純粋な Ruby で明示的にコーディングできるようにしたいと考えています。

これで、次のような user32.dll オブジェクトでテストしたほとんどのアドレスを正常に実装できました。

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

..しかし、 null パラメーターなしでCreateWindowOrを実行することはできません。CreateWindowExそれが助けになる場合は、Python here (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)

「ウィンドウ」が表示された後に発生するのはクラッシュだけです...これは、不適切な処理が原因である可能性がありますが、動作するようになったことを嬉しく思います(少しだけ)! 残りを把握する必要があります...

4

3 に答える 3

4

使用する代わりに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の代わりにnullポインターを使用すると、メッセージボックスに所有者ウィンドウがなくなります。


これが役立つかもしれないいくつかのリンクです:

于 2013-01-06T13:43:27.663 に答える
0

私はWindowsを使用していないため、これをテストしていませんが、定数を使用するつもりだと思いDL::NULLます。ここ (最後から 2 番目の行) で実際に動作しているのを見ることができ、ユース ケースに似ています。お役に立てば幸いです。

于 2011-11-11T21:20:11.797 に答える
-1
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
于 2014-04-10T18:23:22.417 に答える