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 クラスの新しいインスタンスを作成して、そのデータ フィールドにアクセスします。
コード サンプル
Imports System
Imports System.Runtime.InteropServices ' For StructLayout,
' and DllImport
' Declares a class member for each structure element.
<StructLayout(LayoutKind.Sequential)> _
Public Class SystemTime
Public year As Short
Public month As Short
Public weekday As Short
Public day As Short
Public hour As Short
Public minute As Short
Public second As Short
Public millisecond 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
Public Class App
Public Shared Sub Main()
Console.WriteLine("VB .NET SysTime Sample using Platform Invoke")
Dim st As New SystemTime()
LibWrap.GetSystemTime(st)
Console.Write("The Date is: {0} {1} {2}", st.month, st.day, st.year)
End Sub 'Main
End Class 'App
' The program produces output similar to the following:
'
' VB .NET SysTime Sample using Platform Invoke
' The Date is: 3 21 2010
using System;
using System.Runtime.InteropServices; // For StructLayout, DllImport
[StructLayout(LayoutKind.Sequential)]
public class SystemTime
{
public ushort year;
public ushort month;
public ushort weekday;
public ushort day;
public ushort hour;
public ushort minute;
public ushort second;
public ushort millisecond;
}
public class LibWrap
{
// Declares a managed prototype for the unmanaged function using Platform Invoke.
[DllImport("Kernel32.dll")]
public static extern void GetSystemTime([In,Out] SystemTime st);
}
public class App
{
public static void Main()
{
Console.WriteLine("C# SysTime Sample using Platform Invoke");
SystemTime st = new SystemTime();
LibWrap.GetSystemTime(st);
Console.Write("The Date is: ");
Console.Write("{0} {1} {2}", st.month, st.day, st.year );
}
}
// The program produces output similar to the following:
//
// C# SysTime Sample using Platform Invoke
// The Date is: 3 21 2010
using namespace System;
using namespace System::Runtime::InteropServices; // For StructLayout, DllImport
[StructLayout(LayoutKind::Sequential)]
public ref class SystemTime
{
public:
unsigned short year;
unsigned short month;
unsigned short weekday;
unsigned short day;
unsigned short hour;
unsigned short minute;
unsigned short second;
unsigned short millisecond;
};
public class LibWrap
{
public:
// Declares a managed prototype for the unmanaged function using Platform Invoke.
[DllImport("Kernel32.dll")]
static void GetSystemTime([In,Out] SystemTime^ st);
};
public class App
{
public:
static void Main()
{
Console::WriteLine("C++/CLI SysTime Sample using Platform Invoke");
SystemTime^ st = gcnew SystemTime();
LibWrap::GetSystemTime(st);
Console::Write("The Date is: ");
Console::Write("{0} {1} {2}", st->month, st->day, st->year);
}
};
int main()
{
App::Main();
}
// The program produces output similar to the following:
//
// C++/CLI SysTime Sample using Platform Invoke
// The Date is: 3 21 2010