Share via


SysTime 範例

這個範例示範如何傳遞含有整數的類別至預期結構指標的 Unmanaged 函式。

SysTime 範例是使用下列 Unmanaged 函式,顯示其原始函式宣告:

  • 從 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 方法的 Managed 原型,其預設會將 SystemTime 類別當成 In/Out 參數傳遞。必須以 InAttributeOutAttribute 屬性宣告參數,因為類別 (其為參考型別) 預設會被當成 In 參數傳遞。對於要接收結果的呼叫端,必須明確地套用這些方向屬性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: " );
      …
   }
}

請參閱

概念

封送處理類別、結構和等位
平台叫用資料型別
在 Managed 程式碼中建立原型