Partilhar via


Amostra 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 de SysTime usa a seguinte função não gerenciada, mostrada com sua declaração de função original:

  • GetSystemTime exportados do 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, o SystemTime classe contém os elementos da estrutura original representado como membros de classe. O StructLayoutAttribute atributo está definido para garantir que os membros são organizados na memória seqüencialmente, na ordem em que aparecem.

O LibWrap classe contém um protótipo gerenciado da GetSystemTime método, que passa a SystemTime a classe como um parâmetro In/Out por padrão. O parâmetro deve ser declarado com o InAttribute e OutAttribute atributos como classes, que são tipos de referência são passados como parâmetros, por padrão. Para o chamador receber os resultados, eles atributos direcionais deve ser aplicado explicitamente. O App classe cria uma nova instância da SystemTime de classe e acessa seus campos de dados.

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

' The program produces output similar to the following:
'
' VB .NET SysTime Sample using Platform Invoke
' The Date is: 3 21 2010
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 );
    }
}

// The program produces output similar to the following:
//
// C# SysTime Sample using Platform Invoke
// The Date is: 3 21 2010
using namespace System;
using namespace System::Runtime::InteropServices;     // For StructLayout, DllImport

[StructLayout(LayoutKind::Sequential)]
public ref class SystemTime
{
public:
    unsigned short year;
    unsigned short month;
    unsigned short weekday;
    unsigned short day;
    unsigned short hour;
    unsigned short minute;
    unsigned short second;
    unsigned short millisecond;
};

public class LibWrap
{
public:
    // Declares a managed prototype for the unmanaged function using Platform Invoke.
    [DllImport("Kernel32.dll")]
    static void GetSystemTime([In,Out] SystemTime^ st);
};

public class App
{
public:
    static void Main()
    {
        Console::WriteLine("C++/CLI SysTime Sample using Platform Invoke");
        SystemTime^ st = gcnew SystemTime();
        LibWrap::GetSystemTime(st);
        Console::Write("The Date is: ");
        Console::Write("{0} {1} {2}",  st->month, st->day, st->year);
    }
};

int main()
{
    App::Main();
}
// The program produces output similar to the following:
//
// C++/CLI SysTime Sample using Platform Invoke
// The Date is: 3 21 2010

Consulte também

Conceitos

O empacotamento de Classes, estruturas e uniões

Tipos de dados de invocação de plataforma

A criação de protótipos em código gerenciado