金子邦彦研究室プログラミングRuby プログラミングRuby で Win32 API

Ruby で Win32 API

Ruby から Win32 API を呼び出すことは,それほど難しくはありません.次を例として載せます.

参考 にしたWeb ページ http://kone.vis.ne.jp/diary/diaryb13.html#080315_spec (現存しないページ)

Win32 API を使って,メッセージボックスの表示


require 'Win32API'
a = Win32API.new('user32', 'MessageBox', %w(p p p i), 'i')
a.call(0, "test message", "test caption", 4)

[image]

Win32 API を使って音を鳴らす

Beep 関数を呼び出します.Win32 API を使えば簡単に音を鳴らせる! ということで載せています.「262」,「500」とあるのは周波数と時間です.

関連する外部ページhttp://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html


require 'Win32API'
d = Win32API.new('kernel32', 'Beep', %w(i i), 'i')
d.call(262, 500)

Microsoft Visual C++ のシンボル名

Microsoft Visual C++ のシンボル名を分かりやすい形で表示する関数として UnDecorateSymbolNameがあります. これを Ruby から使ってみよう、というわけです.


require 'Win32API'
c = Win32API.new('imagehlp.dll', 'UnDecorateSymbolName', %w(p p i i), 'i')
s = " " * 100
c.call('?hoge2@@YGGG@Z', s, 100, 0)

[image]

Microsoft Visual C++ でコンパイルされた C++ の「関数」を Ruby から呼び出す

前準備

Cygwin があると便利なのでインストールしておく

テスト実行用に使う dll ファイルの作成

評価用として,Microsoft Visual C++ 2010 Express Edition を試してに使い dll ファイルを作成してみる.

  1. Win32 プロジェクトの作成

    [image]

    [image]

    [image]
  2. 関数の定義

    適当な関数を作る

    
    __declspec(dllexport)
    int __stdcall hoge2(int a)
    {
        return a + 2;
    }
    
  3. ビルド

    ビルドする.エラーメッセージが出ていないことを確認する.

    [image]

    メッセージ中に dll ファイル名があるので確認する

  4. 出来た dll ファイルつを、パス (PATH) の通ったディレクトリにコピー

    ここでは hoge2.dll をコピーする.どこにコピーしたかを覚えておくこと.

    [image]
  5. Cygwin のコンソールで strings コマンドを実行

    下の実行例で「/cygdrive/c/Windows/Systems32」とあるのは dll ファイルをコピーしたコピー先のディレクトリ. 「hoge2.dll」は dll ファイル名. 「grep hoge2」の「hoge2」は、先ほど定義した関数名.

    
    cd /cygdrive/c/Windows/Systems32
    strings hoge2.dll | grep hoge2
    

    [image]

    関数のシンボル名が分かる. この場合は「?hoge2@@YGHH@Z

  6. irb を起動し C++ の関数を呼び出してみる

    
    require 'Win32API'
    b = Win32API.new('hoge2.dll', '?hoge2@@YGHH@Z', %w(i), 'i')
    b.call(102)
    

    [image]

    満足.