http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/026w32struct/w32struct.html
・Win32APIを呼び出す
DllImport属性(System.Runtime.InteropServices名前空間)で関数をエクスポートしているDLLのファイル名を指定
宣言にextern staticを付ける
アクセス修飾子(private/public)は自由に付けられる
C#ではヘッダファイルを扱うことができないため、
必要に応じて定数を自分で定義しなければならない。
.NET Frameworkの内部では文字列をUnicodeで処理しているが、
Win32 APIやDLL関数に文字列を渡す場合は、デフォルトでANSI文字セットによる表現に変換される。
Unicode版を使用する場合は、DllImport属性のCharSetフィールドにCharSet.Unicodeを指定する
CharSet列挙型(System.Runtime.InteropServices名前空間)
-----------------------------------------------------------
・例
// Win32 API
// インポートライブラリ : kernel32.lib
BOOL Beep(DWORD dwFreq, DWORD dwDuration);
↓
[DllImport("kernel32.dll")]
extern static bool Beep(uint dwFreq, uint dwDuration);
-----------------------------------------------------------
・引数に値が返される
// Win32 API
// インポートライブラリ : kernel32.lib
BOOL GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons);
↓
[DllImport("kernel32.dll")]
extern static bool GetNumberOfConsoleMouseButtons(ref uint lpNumberOfMouseButtons);
-----------------------------------------------------------
・定数を引数にとる(1)
// Win32 API
// インポートライブラリ : kernel32.lib
#define PF_FLOATING_POINT_PRECISION_ERRATA 0
#define PF_FLOATING_POINT_EMULATED 1
#define PF_COMPARE_EXCHANGE_DOUBLE 2
#define PF_MMX_INSTRUCTIONS_AVAILABLE 3
#define PF_PPC_MOVEMEM_64BIT_OK 4
#define PF_ALPHA_BYTE_INSTRUCTIONS 5
#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
#define PF_RDTSC_INSTRUCTION_AVAILABLE 8
#define PF_PAE_ENABLED 9
#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
BOOL IsProcessorFeaturePresent(DWORD ProcessorFeature);
↓
enum ProcessorFeatures : uint {
PF_FLOATING_POINT_PRECISION_ERRATA = 0,
PF_FLOATING_POINT_EMULATED = 1,
PF_COMPARE_EXCHANGE_DOUBLE = 2,
PF_MMX_INSTRUCTIONS_AVAILABLE = 3,
PF_PPC_MOVEMEM_64BIT_OK = 4,
PF_ALPHA_BYTE_INSTRUCTIONS = 5,
PF_XMMI_INSTRUCTIONS_AVAILABLE = 6,
PF_3DNOW_INSTRUCTIONS_AVAILABLE = 7,
PF_RDTSC_INSTRUCTION_AVAILABLE = 8,
PF_PAE_ENABLED = 9,
PF_XMMI64_INSTRUCTIONS_AVAILABLE = 10
}
[DllImport("kernel32.dll")]
extern static bool IsProcessorFeaturePresent(ProcessorFeatures ProcessorFeature);
-----------------------------------------------------------
・文字列を引数にとる(MBCS)
BOOL SetConsoleTitleA( LPCSTR lpConsoleTitle );
↓
[DllImport("kernel32.dll")]
static extern bool SetConsoleTitleA(string lpConsoleTitle);
or
[DllImport("kernel32.dll")]
static extern bool SetConsoleTitle(string lpConsoleTitle);
-----------------------------------------------------------
・文字列を引数にとる(UNICODE)
BOOL SetConsoleTitleW( LPCWSTR lpConsoleTitle );
↓
[DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
static extern bool SetConsoleTitleW(string lpConsoleTitle);
or
[DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
static extern bool SetConsoleTitle(string lpConsoleTitle);
-----------------------------------------------------------
・文字列を引数にとる(MBCS/UNICODE)
BOOL SetConsoleTitle( LPCTSTR lpConsoleTitle );
↓
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
extern static bool SetConsoleTitle(string lpConsoleTitle);
-----------------------------------------------------------
・構造体を引数にとる
.NET Frameworkでは、通常、アクセスに最適な配置となるように、
CLRがメモリ上における構造体の各メンバの配置を決定する。
つまり、単純に同じ構造体をC#などで宣言しただけでは、
各メンバのオフセットをDLL側と確実に一致させることは不可能である。
Win32 APIやDLL関数に渡す構造体を定義する場合は、そのメンバの配置方法を変更する必要がある。
構造体に対してStructLayout属性(System.Runtime.InteropServices名前空間)を設定する。
配置方法としてLayoutKind列挙体(System.Runtime.InteropServices名前空間)を指定する。
C言語などの構造体と同様に、メンバが宣言された順に配置されるようにするには、
LayoutKind.Sequentialという値を指定する。
フィールドのスコープはすべてpublicにしておかなければならない。
フィールドを宣言する順序は、元のC言語での定義と完全に一致させる必要がある。
typedef struct tagPOINT {
LONG x;
LONG y;
} POINT;
↓
[StructLayout(LayoutKind.Sequential)]
struct POINT {
public int x;
public int y;
}
-----------------------------------------------------------
APIでの型名 対応するC#の型
HANDLE (void *) System.IntPtr
BYTE (unsigned char) byte (System.Byte)
SHORT (short) short (System.Int16)
WORD (unsigned short) ushort (System.UInt16)
INT (int) int (System.Int32)
LONG (long) int (System.Int32)
UINT (unsigned int) uint (System.UInt32)
DWORD (unsigned long) uint (System.UInt32)
ULONG (unsigned long) uint (System.UInt32)
BOOL (long) bool (System.Boolean)
CHAR (char) char (System.Char)
LPSTR (char *) System.Text.StringBuilder
LPWSTR (wchar_t *) System.Text.StringBuilder
LPCSTR (const char *) string (System.String)
LPCWSTR (const wchar_t *) string (System.String)
FLOAT (float) float (System.Single)
DOUBLE (double) double (System.Double)
WindowsのDLL(Win32 API)と.NET Frameworkとでは型の管理方法が違うため、
実際には型の相互変換(マーシャリング)が行われる
-----------------------------------------------------------
最終更新:2009年01月08日 11:53