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