[C#] Win32 APIなどとのリンク

.NET classから.NET以外で書かれたDLL(Dynamic Link Library)、Win32 APIを呼び出すことができる。
ペツォルドの本では、Win32API 関数 GetSystemTimeを呼び出す例。
呼び出される関数は

void GetSystemTikme(LPSYSTEMTIME lpSystemTime);

引数は以下のC言語風のstruct

typedef struct _SYSTEMTIME
{
   WORD wYear;
   WORD wMonth;
   WORD wDayOfWeek;
   WORD wDay;
   WORD wHour;
   WORD wMinute;
   WORD wSecond;
   WORD wMilleseconds;
} SYSTEMTIME, *PSYSTEMTIME;

引数は同じ形式にするためにclass中のfieldの配置を属性(attribute) StructLayoutで順に並ぶように指定。

[StructLayout(LayoutKind.Sequential)]
class SystemTime
{
   public ushort wYear;
   public ushort wMonth;
   public ushort wDayOfWeek;
   public ushort wDay;
   public ushort wHour;
   public ushort wMinute;
   public ushort wSecond;
   public ushort wMilleseconds;
}

つぎに、Win32関数が外部にあることをextern宣言する。

[DllImport("kernel32.dll")]
static extern void GetSystemTime(SystemTime st);

これを使って、SuperDateというclassの中からこの関数を呼ぶことにすると:

public static SuperDate Today()
{
   SystemTime systime = new SystemTime();
   GetSystemTime(systime);
   return new SuperDate(systime.wYear, systime.wMonth, systime.wDay);
}

SystemTimeがclassなのでcall by referenceになる。ここでSystemTimeがstructであれば関数からSystemTimeを受け取るためにoutキーワードを使って

static extern void GetSystemTime(out SystemTime st);

とする。
structはnewを必要としないので、呼び出し部分は

SystemTime systime;
GetSystemTime(out systime);

とする。
この手法は PInvoke (platform invoke)と呼ばれる。
詳しくは
http://www.pinvoke.net/
 を参照。

広告
%d人のブロガーが「いいね」をつけました。