Esempio di SysTime
Aggiornamento: novembre 2007
In questo esempio viene dimostrato come passare un puntatore a una classe a una funzione non gestita per la quale è previsto un puntatore a una struttura.
Nell'esempio di SysTime viene utilizzata la seguente funzione non gestita, illustrata con la dichiarazione di funzione originale:
GetSystemTime esportata da Kernel32.dll.
VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
La struttura originale passata alla funzione contiene i seguenti elementi:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
In questo esempio, la classe SystemTime contiene gli elementi della struttura originale rappresentati come membri di classe. L'attributo StructLayoutAttribute è impostato in modo da garantire che i membri vengano inseriti in memoria in sequenza, nell'ordine in cui appaiono.
La classe LibWrap contiene un prototipo gestito del metodo GetSystemTime, che passa la classe SystemTime come parametro in/out per impostazione predefinita. È necessario dichiarare il parametro con gli attributi InAttribute e OutAttribute poiché le classi, che sono tipi di riferimento, vengono passate come parametri in per impostazione predefinita. Affinché il chiamante riceva i risultati, è necessario applicare questi attributi direzionali in modo esplicito. Con la classe App si crea una nuova istanza della classe SystemTime e si accede ai relativi campi di dati.
Il codice sorgente per gli esempi di codice riportati di seguito è fornito dall'Esempio di tecnologia di richiamo piattaforma di .NET Framework.
Esempi di codice
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
Output previsto:
Esempio di SysTime in VB .NET utilizzando pInvoke
Data: 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 );
}
}
Output previsto:
Esempio di SysTime in C# utilizzando pInvoke
Data: 31 10 2006
Vedere anche
Concetti
Marshalling di classi, strutture e unioni