SysTime のサンプル
このサンプルでは、整数を含むクラスを、構造体へのポインタを要求するアンマネージ関数に渡す方法を示します。
SysTime のサンプルで使用するアンマネージ関数とその関数宣言を次に示します。
Kernel32.dll からエクスポートされる GetSystemTime
VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
関数に渡された元の構造体には、次に示す要素が含まれています。
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
このサンプルでは、SystemTime
クラスの中には、クラス メンバとして表現される、元の構造体の要素が含まれます。各メンバが出現する順番でメモリ内に順次配列されることを保証するために、StructLayoutAttribute 属性を設定します。
LibWrap
クラスには、GetSystemTime
メソッドのマネージ プロトタイプが含まれます。このメソッドは、既定で SystemTime
クラスを In/Out パラメータとして渡します。クラスは参照型であり、既定ではクラスが In パラメータとして渡されるため、パラメータの宣言時には InAttribute 属性と OutAttribute 属性を使用する必要があります。呼び出し元が結果を受け取るためには、これらの方向属性を明示的に適用する必要があります。App
クラスは SystemTime
クラスの新しいインスタンスを作成して、そのデータ フィールドにアクセスします。
次のコード例のソース コードは、.NET Framework「プラットフォーム呼び出しの技術サンプル」で提供されています。
プロトタイプの宣言
' Declares a class member for each structure element.
< StructLayout(LayoutKind.Sequential )> _
Public Class SystemTime
Public year As Short
…
Public milliseconds As Short
End Class 'SystemTime
Public Class LibWrap
' Declares a managed prototype for the unmanaged function.
Declare Sub GetSystemTime Lib "Kernel32.dll" ( <[In], Out> ByVal st _
As SystemTime )
End Class 'LibWrap
// Declares a class member for each structure element.
[ StructLayout( LayoutKind.Sequential )]
public class SystemTime
{
public ushort year;
…
public ushort milliseconds;
}
public class LibWrap
{
// Declares a managed prototype for the unmanaged function.
[ DllImport( "Kernel32.dll" )]
public static extern void GetSystemTime( [In,Out] SystemTime st );
}
関数の呼び出し
Public Class App
Public Shared Sub Main()
Dim st As New SystemTime()
LibWrap.GetSystemTime( st )
Console.Write( "The Date and Time is: " )
…
End Sub 'Main
End Class 'App
public class App
{
public static void Main()
{
SystemTime st = new SystemTime();
LibWrap.GetSystemTime( st );
Console.Write( "The Date and Time is: " );
…
}
}
参照
概念
クラス、構造体、および共用体のマーシャリング
プラットフォーム呼び出しのデータ型
マネージ コードでのプロトタイプの作成