Ruby で Win32 API
Ruby から Win32 API を呼び出すことは,それほど難しくはありません.次を例として載せます.
- Win32 API を使って,メッセージボックスの表示 ・・・ 最も簡単な例、と言って良いでしょう
- Win32 API を使って,音を鳴らす ・・・ Win32 API を使うと簡単だ、とい例
- Microsoft Visual C++ のシンボル名の処理 ・・・ 結果が文字列の例(引数として文字列へのポインタを渡すと、そこに結果が入る)
- 自前で作った dll ファイルの例 ・・・ 自前の C++ プログラムを,Ruby から呼び出す例
参考 にした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)

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)

Microsoft Visual C++ でコンパイルされた C++ の「関数」を Ruby から呼び出す
前準備
Cygwin があると便利なのでインストールしておく
テスト実行用に使う dll ファイルの作成
評価用として,Microsoft Visual C++ 2010 Express Edition を試してに使い dll ファイルを作成してみる.
- Win32 プロジェクトの作成
- 関数の定義
適当な関数を作る
__declspec(dllexport) int __stdcall hoge2(int a) { return a + 2; }
- ビルド
ビルドする.エラーメッセージが出ていないことを確認する.
メッセージ中に dll ファイル名があるので確認する
- 出来た dll ファイルつを、パス (PATH) の通ったディレクトリにコピー
ここでは hoge2.dll をコピーする.どこにコピーしたかを覚えておくこと.
- Cygwin のコンソールで strings コマンドを実行
下の実行例で「/cygdrive/c/Windows/Systems32」とあるのは dll ファイルをコピーしたコピー先のディレクトリ. 「hoge2.dll」は dll ファイル名. 「grep hoge2」の「hoge2」は、先ほど定義した関数名.
cd /cygdrive/c/Windows/Systems32 strings hoge2.dll | grep hoge2
関数のシンボル名が分かる. この場合は「?hoge2@@YGHH@Z」
- irb を起動し C++ の関数を呼び出してみる
require 'Win32API' b = Win32API.new('hoge2.dll', '?hoge2@@YGHH@Z', %w(i), 'i') b.call(102)
満足.
- irb を起動し C++ の関数を呼び出してみる