OrangeMaker_logo
memo アイコン C# - .net 備忘録

mfcプログラマからみたC#や.netに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

Win32APIを呼び出す

 Win32APIを直接呼び出す方法についてのまとめ。

 .net環境からWin32APIを呼び出す方法は基本的にDLL名称と呼び出し形式がわかっていれば可能です。

 Win32の書式:
        BOOL Beep(DWORD dwFreq, DWORD dwDuration);

 C#から呼び出す場合の宣言:
        [DllImport("kernel32.dll")]
        extern static bool Beep(uint dwFreq, uint dwDuration);

   値渡しの場合は、このような宣言を行えば簡単にWin32が使用できます。

 型の対応は以下の表のようになります。

Win32の型(Cの型) C#の型(.net FrameWorkの型)
HANDLE (void *) System.IntPtr
BYTE (unsigned char) byte (System.Byte)
SHORT (short) short (System.Int16)
WORD (unsigned short) ushort (System.UInt16)
INT (int)
LONG (long)
int (System.Int32)
UINT (unsigned int)
DWORD, ULONG (unsigned long)
uint (System.UInt32)
BOOL (long) bool (System.Boolean)
CHAR (char) char (System.Char)
LPSTR (char *)
LPWSTR (wchar_t *)
System.Text.StringBuilder
LPCSTR (const char *)
LPCWSTR (const wchar_t *)
string (System.String)
FLOAT (float) float (System.Single)
DOUBLE (double) double (System.Double)

Win32側の型が&付きや文字列以外のポインタ渡しの場合は宣言の前にrefを付けてC#の参照渡しを宣言する。

次に引数に構造体や構造体へのポインタもWin32APIでは多用されています。

RECT構造体の場合次のようになります。

[StructLayout(LayoutKind.Sequential)]
struct RECT {
    public int left;
    public int top;
    public int right;
    public int bottom;
}

注意点は、元のWin32の構造体の順番通り宣言する必要がある点です。
(Win32のヘッダファイルを確認すること!)