「hmRb・IronRuby」から「ネイティブdll」のWin32 APIを利用する。

概要

IronPythonとは異なり、IronRubyの方には、標準Ruby相当のWin32APIにアクセスする専用のライブラリが入っています。

# coding: utf-16
require 'mscorlib'
require "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
load_assembly 'IronRuby.Libraries', 'IronRuby.StandardLibrary.Win32API'

$MessageBox = Win32API.new 'user32', 'MessageBoxW', %(p p p p), 'i'
$MessageBox.call(0, 'ruby message', 'ruby title', 0)

しかし、残念ながら文字化けが回避しようとすると、文字列のコンバートだらけとなってしまいます。
一般的にはIronRubyでWin32を呼び出す時には(IronPythonもそうですが)
C#でアセンブリを作成した方がスッキリした形になるでしょう。

PICTURE

C#でラップする例

C#を使ってラップする例としては、以下のように、dll名自体をclassとするのが良いでしょう。

以下をdllとしてコンパイルし、IronRubyから利用する方法は、「C#」で作ったdllの読み込みを参照のこと。

#using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace UnmanagedCode
{
    public class GDI32
    {
        [DllImport("GDI32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [DllImport("GDI32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth,
            int nHeight);

        [DllImport("GDI32.dll")]
        public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);

        [DllImport("GDI32.dll")]
        public static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest,
                                         int nWidth, int nHeight, IntPtr hdcSrc,
                                         int nXSrc, int nYSrc, int dwRop);

        [DllImport("GDI32.dll")]
        public static extern bool DeleteDC(IntPtr hdc);

        [DllImport("GDI32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
    }

    public class User32
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();

        [DllImport("user32.dll")]
        public static extern IntPtr GetTopWindow(IntPtr hWnd);

        [DllImport("user32.dll")]
        public static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd);

        [DllImport("User32.dll")]
        public static extern IntPtr GetWindowDC(IntPtr hWnd);

        [DllImport("User32.dll")]
        public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);

    }
}