Partager via


SysTime, exemple

Mise à jour : novembre 2007

Cet exemple montre comment passer un pointeur désignant une classe à une fonction non managée qui nécessite un pointeur vers une structure.

L'exemple SysTime utilise la fonction non managée suivante, illustrée avec sa déclaration de fonction d'origine :

  • GetSystemTime exportée à partir de Kernel32.dll.

    VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
    

La structure d'origine passée vers la fonction contient les éléments suivants :

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

Dans cet exemple, la classe SystemTime contient les éléments de la structure d'origine représentée en tant que membres de classe. L'attribut StructLayoutAttribute est défini afin de garantir que les membres soient disposés en mémoire de manière séquentielle, dans l'ordre de leur apparition.

La classe LibWrap contient un prototype managé de la méthode GetSystemTime qui passe la classe SystemTime comme paramètre en entrée/sortie par défaut. Le paramètre doit être déclaré à l'aide des attributs InAttribute et OutAttribute car les classes qui sont des types référence, sont passées comme paramètres en entrée par défaut. Pour que l'appelant reçoive les résultats, ces attributs directionnels doivent être appliqués de manière explicite. La classe App crée une nouvelle instance de la classe SystemTime et accède à ses champs de données.

Le code source pour les exemples de code suivants est fourni par Appel de plate-forme, exemple de technologie du .NET Framework.

Exemples de code

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

Sortie attendue :

SysTime VB .NET, exemple utilisant l'appel de code non managé

La date est : 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 );
    }
}

Sortie attendue :

SysTime C#, exemple utilisant l'appel de code non managé

La date est : 31 10 2006

Voir aussi

Concepts

Marshaling de classes, de structures, et d'unions

Types de données d'appel de plate-forme

Création de prototypes dans du code managé