SysTime Sample

This sample demonstrates how to pass a class containing integers to an unmanaged function that expects a pointer to a structure. The Microsoft .NET Framework SDK includes the complete Visual Basic .NET and C# versions of this sample in Samples\Technologies\Interop\Platform-Invoke.

The SysTime sample uses the following unmanaged function, shown with its original function declaration:

  • GetSystemTime exported from Kernel32.dll.

    VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
    

The original structure passed to the function contains the following elements:

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

In this sample, the SystemTime class contains the elements of the original structure represented as class members. The StructLayoutAttribute attribute is set to ensure that the members are arranged in memory sequentially, in the order in which they appear.

The LibWrap class contains a managed prototype of the GetSystemTime method, which passes the SystemTime class as an In/Out parameter by default. The parameter must be declared with the InAttribute and OutAttribute attributes because classes, which are reference types, are passed as In parameters by default. For the caller to receive the results, these directional attributes must be applied explicitly. The App class creates a new instance of the SystemTime class and accesses its data fields.

Declaring Prototypes

' 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
[C#]// 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 );
}

Calling Functions

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
[C#]public class App
{
   public static void Main()
   {
      SystemTime st = new SystemTime();
      LibWrap.GetSystemTime( st );
      Console.Write( "The Date and Time is: " );
      ...
   }
}

See Also

Marshaling Classes, Structures, and Unions | Platform Invoke Data Types | Creating Prototypes in Managed Code