2009年4月1日水曜日

require 'dl' してみた ... 便利だった

Win32APIをRuby/DLで呼び出してみた。
Ruby/Win32APIを使う(RubyのWin32APIとUNICODE)よりも簡単。

sample.rb
#!/usr/local/bin/ruby -Ku
# -*- encoding: utf-8 -*-

require 'dl/import'
require 'iconv'

module DSO
extend DL::Importable
dlload 'Kernel32', 'User32'
extern 'int GetTickCount()'
extern 'int MessageBoxA(int, char*, char*, int)'
extern 'int MessageBoxW(int, wchar_t*, wchar_t*, int)'
end

def s(x)
Iconv.iconv('shift_jis', 'utf-8', x + 0.chr)[0]
end

def u(x)
Iconv.iconv('utf-16le', 'utf-8', x + 0.chr)[0]
end

p DSO.getTickCount
p DSO.messageBoxA(0, s('あabc'), s('あabc'), 0)
p DSO.messageBoxW(0, u('あabc'), u('あabc'), 1)

ちなみに、ruby-1.9.1p0(に同梱されていたRuby/DL)では動かない。
  1. DL::ImportableがDL::Importerに
  2. 先頭が大文字の関数名でもそのままexternされるように
という仕様変更があったようだ。

sample_for_ruby-1_9_1.rb
#!/usr/local/bin/ruby -Ku
# -*- encoding: utf-8 -*-

require 'dl/import'
require 'iconv'

module DSO
extend DL::Importer
dlload 'Kernel32', 'User32'
extern 'int GetTickCount()'
extern 'int MessageBoxA(int, char*, char*, int)'
extern 'int MessageBoxW(int, wchar_t*, wchar_t*, int)'
end

def s(x)
Iconv.iconv('shift_jis', 'utf-8', x + 0.chr)[0]
end

def u(x)
Iconv.iconv('utf-16le', 'utf-8', x + 0.chr)[0]
end

p DSO.GetTickCount
p DSO.MessageBoxA(0, s('あabc'), s('あabc'), 0)
p DSO.MessageBoxW(0, u('あabc'), u('あabc'), 1)

0 件のコメント:

コメントを投稿