Ruby から Win32 API を呼び出すことは,それほど難しくはありません.次を例として載せます.
参考 にしたWeb ページ http://kone.vis.ne.jp/diary/diaryb13.html#080315_spec (現存しないページ)
require 'Win32API'
a = Win32API.new('user32', 'MessageBox', %w(p p p i), 'i')
a.call(0, "test message", "test caption", 4)
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++ のシンボル名を分かりやすい形で表示する関数として 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)
Cygwin があると便利なのでインストールしておく
評価用として,Microsoft Visual C++ 2010 Express Edition を試してに使い dll ファイルを作成してみる.
適当な関数を作る
__declspec(dllexport)
int __stdcall hoge2(int a)
{
return a + 2;
}
ビルドする.エラーメッセージが出ていないことを確認する.
メッセージ中に dll ファイル名があるので確認する
ここでは hoge2.dll をコピーする.どこにコピーしたかを覚えておくこと.
下の実行例で「/cygdrive/c/Windows/Systems32」とあるのは dll ファイルをコピーしたコピー先のディレクトリ. 「hoge2.dll」は dll ファイル名. 「grep hoge2」の「hoge2」は、先ほど定義した関数名.
cd /cygdrive/c/Windows/Systems32
strings hoge2.dll | grep hoge2
関数のシンボル名が分かる.
この場合は「?hoge2@@YGHH@Z」
満足.
require 'Win32API'
b = Win32API.new('hoge2.dll', '?hoge2@@YGHH@Z', %w(i), 'i')
b.call(102)