Sdílet prostřednictvím


SysTime-Beispiel

Aktualisiert: November 2007

Dieses Beispiel demonstriert, wie ein Zeiger auf eine Klasse an eine nicht verwaltete Funktion übergeben wird, die einen Zeiger auf eine Struktur erwartet.

Das SysTime-Beispiel verwendet die folgende nicht verwaltete Funktion, die zusammen mit ihrer ursprünglichen Funktionsdeklaration aufgeführt wird:

  • GetSystemTime aus Kernel32.dll exportiert.

    VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
    

Die ursprüngliche, an die Funktion übergebene Struktur enthält die folgenden Elemente:

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

In diesem Beispiel enthält die SystemTime-Klasse die Elemente der Originalstruktur, dargestellt als Klassenmember. Das StructLayoutAttribute-Attribut ist so eingerichtet, dass sichergestellt wird, dass die Member im Speicher sequenziell in der Reihenfolge ihres Erscheinens angeordnet sind.

Die LibWrap-Klasse enthält einen verwalteten Prototyp der GetSystemTime-Methode, der die SystemTime-Klasse standardmäßig als In/Out-Parameter übergibt. Der Parameter muss mit dem InAttribute-Attribut und dem OutAttribute-Attribut deklariert werden, da Klassen, bei denen es sich um Referenztypen handelt, standardmäßig als In-Parameter übergeben werden. Damit der Aufrufer die Ergebnisse erhält, müssen diese direktionalen Attribute explizit angewendet werden. Die App-Klasse erstellt eine neue Instanz der SystemTime-Klasse und greift auf ihre Datenfelder zu.

Der Quellcode für die folgenden Codebeispiele wird im Technologiebeispiel für Plattformaufrufe in .NET Framework bereitgestellt.

Codebeispiele

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

Erwartete Ausgabe:

VB .NET SysTime Sample mit Plattformaufruf

Das Datum ist: 31.10.2006

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 );
    }
}

Erwartete Ausgabe:

C# SysTime Sample mit Plattformaufruf

Das Datum ist: 31.10.2006

Siehe auch

Konzepte

Marshallen von Klassen, Strukturen und Unions

Datentypen für den Plattformaufruf

Erstellen von Prototypen in verwaltetem Code