Partilhar via


Exemplo de SysTime

Este exemplo demonstra como passar um ponteiro para uma classe para uma função não gerenciada que espera um ponteiro para uma estrutura.

O exemplo SysTime utiliza a seguinte função não gerenciada, mostrada com sua declaração de função original:

  • GetSystemTime exportados de Kernel32.dll.

    VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
    

A estrutura original passada para a função contém os seguintes elementos:

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

Neste exemplo, a SystemTime classe contém sistema autônomo elementos da estrutura original representado sistema autônomo membros de classe. The StructLayoutAttribute atributo é definido para garantir que os membros são organizados em memória seqüencialmente, na ordem em que aparecem.

The LibWrap classe contém um protótipo do gerenciado de GetSystemTime método, que passa a SystemTime classe sistema autônomo um in/out parâmetro por padrão. O parâmetro deve ser declarado com o InAttribute e OutAttribute atributos sistema autônomo referência a classes, que são tipos, são passados sistema autônomo in parâmetros por padrão. Para o chamador deve receber os resultados desses atributos direcionais devem ser aplicadas explicitamente.The App classe cria uma nova instância das SystemTime classe e acessa seus campos de dados.

O código-fonte para os exemplos de código a seguir é fornecido pelo.NET estrutura Invocação de plataforma Tecnologia Exemplo.

Exemplos 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

Saída esperada:

VB .NET SysTime amostra usando invocação de plataforma

A data é: 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 );
    }
}

Saída esperada:

Exemplo de SysTime translation from VPE for Csharp usando invocação de plataforma

A data é: 10 31 2006

Consulte também

Conceitos

marshaling de classes, estruturas e uniões

Tipos de dados de invocação de plataforma

Criando protótipos em código gerenciado