Archive for 4月 23rd, 2012

  1. Hello, Win32 API(C#) World!

    Posted on 4月 23rd, 2012 by cx20

    Win32 API(C#)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は C# にて DllImport 属性を用いた呼出し例である。

    ソースコード

    using System;
    using System.Runtime.InteropServices;
     
    class Hello
    {
         [DllImport("user32.dll", CharSet=CharSet.Auto)]
         private extern static uint MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint uType);
         static void Main(string[] args)
        {
            MessageBox( new IntPtr(0), "Hello, Win32 API(C#) World!", "Hello, World!", 0 );
        }
    }

    「文字セット」に「Auto」を指定した場合は「関数定義」「プラットフォーム」に応じて、呼び出される API 関数名が自動判別される。
    「文字セット」に「Ansi」もしくは「Unicode」を指定した場合それぞれ、末尾が “A” / “W” の API 関数名として自動判別される。

    文字セット指定 関数定義 プラットフォーム 文字変換 判別 API関数名
    Auto MessageBox Windows 9x系 ANSI “A” MessageBoxA
    Auto MessageBox Windows NT系 Unicode “W” MessageBoxW
    Ansi または 省略 MessageBox ANSI “A” MessageBoxA
    Ansi または 省略 MessageBoxA ANSI MessageBoxA
    Unicode MessageBox Unicode “W” MessageBoxW
    Unicode MessageBoxW Unicode MessageBoxW

    また、Win32 データ型と C# データ型の対応は主に以下のようになっている。文字関連の型に関しては文字セット指定が必要なことに注意。

    Win32 データ型 C/C++ データ型 .NET データ型 C# データ型
    HANDLE void * IntPtr
    BYTE unsigned char Byte byte
    SHORT short Int16 short
    WORD unsigned short UInt16 ushort
    INT int Int32 int
    UINT unsigned int UInt32 uint
    LONG long Int32 int
    BOOL int Int32 int
    DWORD unsigned long UInt32 uint
    ULONG unsigned long UInt32 uint
    CHAR char Char (Ansi) char (Ansi)
    WCHAR wchar_t Char (Unicode) char (Unicode)
    LPSTR char * StringBuilder (Ansi)
    LPCSTR const char * String (Ansi) string (Ansi)
    LPWSTR wchar_t * StringBuilder (Unicode)
    LPCWSTR const wchar_t * String (Unicode) string (Unicode)
    FLOAT float Single float
    DOUBLE double Double double

    コンパイル方法

    C:¥> csc Hello.cs

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API(C#) World!
    ---------------------------
    OK   
    ---------------------------