「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#でアセンブリを作成した方がスッキリした形になるでしょう。

    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);
    
        }
    }