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 などにコピーすればよい。