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

  • 概要

    こちらは王道となる「C#でラップする例」となります。

    これは「C#」で作ったdllの読み込みと同じこととなります。

  • 「C#」でのラップ例

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

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

    C#で作ったdllを利用するIronPythonは以下のようなパターンとなることでしょう。
    「currentmacrodirectory」がなぜ必要かなどは、「C#」で作ったdllの読み込みを参照してください。

    import clr
    
    import sys
    # currentmacrodirectoryは秀丸マクロ側から伝達されているものとする
    sys.path.append(currentmacrodirectory)
    # dllの名前を拡張子など抜きで
    clr.AddReferenceByPartialName("UnmanagedCode")
    clr.AddReference('System.Drawing')
    
    from System.Drawing import Bitmap, Image
    from UnmanagedCode import User32, GDI32
    
    def ScreenCapture(x, y, width, height):
         hdcSrc = User32.GetWindowDC(User32.GetDesktopWindow())
         hdcDest = GDI32.CreateCompatibleDC(hdcSrc)
         hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height)
         GDI32.SelectObject(hdcDest, hBitmap)
    
         #・・・・