RubyでWindowsアプリ
Ruby からDLLを呼ぶ
DLLを作る
http://www.angel.ne.jp/~mike/vb_dll/index.htmlなどを参照してDLLを作る。
DLLを呼ぶ
require 'dl/win32' t=Win32API.new('test.dll','fncSub',['i','i'],'i') p t.call(1,5)
のようにすると上でつくったDLLを呼べる。['i','i']は引数の型、'i'は戻り値の型を表す。
Win32APIを呼ぶ
同じようにuser32.dllを指定すれば呼べるのだが、ちょっと複雑なことまでサポートしようとすると 以下のようにしたほうが幸せかも。
require 'dl/win32' require 'dl/import' User32 = DL.dlopen("user32") #メッセージボックスを表示するだけ。 mb= User32['MessageBoxA',"LLPPI"] mb.call(0,"hoge","caption",0) #現在開いてる窓のハンドラを列挙。 ew= User32['EnumWindows', '0PL'] enum_windows_proc = DL.callback('IL') do |hwnd| puts hwnd -1 end ew.call(enum_windows_proc, 0)
"LLPPI"などは型を表す。最初のは戻り値の型で、それ以降は引数の型。こちらを参考にMSDNに 合わせて書く。 EnumWindowsみたいにコールバック関数を指定しないといけないタイプの APIはDL.callbackを使う。
「FAXと画像ビューワ」を呼ぶ
require 'dl/win32' require 'dl/import' t=DL.dlopen('c:\windows\system32\Shimgvw.dll') im=t['ImageView_FullscreenA',"LLLPI"] im.call(0,0,'c:\hoge\test.png',0)
ビューワを落とさないと戻ってこないのね。
VisualStudioでActiveScriptRuby の拡張ライブラリをコンパイル
artonさんのヘッダファイルをインストール。 VisualStudioのvsvars32.batを実行して、
ruby extconf.rb nmake nmake install
Ruby拡張ライブラリをビルドも参照のこと。
MingwでActiveScriptRuby用の拡張ライブラリをコンパイル
なんでこんなことが必要かというと、 GNU依存性の高いライブラリではMSVCで拡張ライブラリをビルドするのが面倒だったり、そもそもMSVCを 使いたくなかったりするため。 でも、インストールの敷居はASRやOneClickInstallerとかのほうが低いので、人にはおすすめしやすい。 もうWindows用の拡張ライブラリはバイナリ配布でよくね?
Mingw,MSYSをインストールしてrubyを./configure;make;make installすると、 なぜか/c/usr/local/以下にインストールされてしまうので、c:/msys/1.0/ などにlocal以下をコピー。c:/msys/1.0/が/usr/としてマッピングされているので注意。
このrubyを使ってビルドした*.soはmswin32版でも利用できるので、 C:\Program Files\ruby-1.8\lib\ruby\site_ruby\1.8\i386-msvcrt などにコピーすればよい。