Compartir a través de


Ejemplo SysTime

Actualización: noviembre 2007

En este ejemplo se muestra cómo pasar un puntero a una clase a una función no administrada que espera recibir un puntero a una estructura.

En el ejemplo SysTime se utiliza la siguiente función no administrada, que se muestra con su declaración de función original:

  • GetSystemTime exportada desde Kernel32.dll.

    VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
    

La estructura original pasada a la función contiene los elementos siguientes:

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

En este ejemplo, la clase SystemTime contiene los elementos de la estructura original representados como miembros de clase. El atributo StructLayoutAttribute se establece para garantizar que los miembros se organizan secuencialmente en la memoria, en el orden en que aparecen.

La clase LibWrap contiene un prototipo administrado del método GetSystemTime, que pasa la clase SystemTime como parámetro In/Out de forma predeterminada. El parámetro se debe declarar con los atributos InAttribute y OutAttribute porque las clases, que son tipos de referencia, se pasan como parámetros In de forma predeterminada. Para que el llamador reciba los resultados, los atributos direccionales se deben aplicar de forma explícita. La clase App crea una nueva instancia de la clase SystemTime y obtiene acceso a sus campos de datos.

El código fuente de los ejemplos de código siguientes lo proporciona el Ejemplo de tecnología de invocación de plataformas de .NET Framework.

Ejemplos de código

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

Resultado esperado:

Ejemplos de SysTime de VB .NET utilizando invocación de plataforma

La fecha es: 10 31 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 );
    }
}

Resultado esperado:

Ejemplo de SysTime de C# utilizando invocación de plataforma

La fecha es: 10 31 2006

Vea también

Conceptos

Calcular referencias de clases, estructuras y uniones

Tipos de datos de invocación de plataforma

Crear prototipos en código administrado