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

  • 概要

    「一般的なアプリケーション作成」ならいざ知らず、「組み込みマクロ」としての利用用途において、
    巨大ライブラリ「.NET Framework」を利用できる「hmPy/IronPython」で、
    わざわざ「Win32 API」を利用したい機会は、そう多くはないと思います。

    しかし、その口が用意されていないわけではありません。

    比較的簡単なWin32 APIであれば、以下のclrtype.pyを利用することでも対処は可能でしょう。
    しかし、複雑な構造体を持つWin32 APIを利用したい場合は、C#でラップDLL作成を作成することを検討した方がよいでしょう。

    clrtype.py

    clrtype.pyとは、IronPythonにおいて、Win32 APIを利用するために、
    Microsoftが作成した、簡易なIronPython用モジュールです。
    1つのファイルだけで構成されています。

  • ダウンロード

    DOWNLOAD ⇒ clrtype.pyファイル。

    インストール

    秀丸のディレクトリ(hidemaru.exe)と同じ場所にコピー。
    (※これは原本であって直接よまれる対象ではありません。)
    (hmPy.dllやIronPython.dllも同じ場所にあるものとして解説します。)

    使い方

    C#でWin32 APIを利用していた方であれば、理解できる記述方法だと思われます。
    生のIronPythonでは以下のように記述します。

    import clr
    import clrtype
    import System
    from System.Reflection import BindingFlags
    
    class Win32(object):
        __metaclass__ = clrtype.ClrClass
    
        from System.Runtime.InteropServices import DllImportAttribute
        DllImport = clrtype.attribute(DllImportAttribute)
    
        @staticmethod
        @DllImport("user32.dll")
        @clrtype.accepts(System.IntPtr, System.String, System.String, System.UInt32)
        @clrtype.returns(System.Int32)
        def MessageBox(hwnd, text, caption, type): raise RuntimeError("Runtime Error")
    
    Win32.MessageBox(System.IntPtr.Zero, "Hello, Win32 API(IronPython) World!", "Hello, World!", 0)
    

    この.macファイルと同じフォルダにclrtype.pyをコピーしてください(これが実際に読み込まれる対象です)

    秀丸マクロ内のhmPyで記述すると、以下のようになります。

     #PY = loaddll( hidemarudir + @"\hmPy.dll" );
     
    #_ = dllfuncw(#PY, "DoString", R"IRONPYTHON(
    import clr
    import clrtype
    import System
    from System.Reflection import BindingFlags
    class Win32(object):
        __metaclass__ = clrtype.ClrClass
    
        from System.Runtime.InteropServices import DllImportAttribute
        DllImport = clrtype.attribute(DllImportAttribute)
    
        @staticmethod
        @DllImport('user32.dll')
        @clrtype.accepts(System.IntPtr, System.String, System.String, System.UInt32)
        @clrtype.returns(System.Int32)
        def MessageBox(hwnd, text, caption, type): raise RuntimeError('Runtime Error')
    
    Win32.MessageBox(System.IntPtr.Zero, 'Hello, Win32 API(IronPython) 秀丸 World!', 'Hello, 秀丸 World!', 0)
    
    )IRONPYTHON"
    );
     
    freedll(#PY);
    

    PICTURE

    ライセンス

    「clrtype.py」は、スクリプトファイル自体にライセンスが記載されており、Apache License 2.0です。