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)では動かない。
- DL::ImportableがDL::Importerに
- 先頭が大文字の関数名でもそのまま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 件のコメント:
コメントを投稿