다음을 통해 공유


SysTime 샘플

이 샘플에서는 구조체에 대한 포인터를 필요로 하는 관리되지 않는 함수에 클래스에 대한 포인터를 전달하는 방법을 보여 줍니다.

SysTime 샘플에서는 다음의 관리되지 않는 함수를 사용합니다. 이 함수는 원래의 함수 선언과 함께 표시되어 있습니다.

  • Kernel32.dll에서 내보낸 GetSystemTime

    VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
    

이 함수에 전달된 원래 구조체에는 다음 요소가 포함되어 있습니다.

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

이 샘플에서, SystemTime 클래스에는 원래 구조체의 요소가 클래스 멤버로 포함되어 있습니다. 멤버가 나타나는 순서에 따라 메모리에 순차적으로 정렬되도록 StructLayoutAttribute 특성이 설정됩니다.

LibWrap 클래스에는 SystemTime 클래스를 기본적으로 In/Out 매개 변수를 통해 전달하는 GetSystemTime 메서드의 관리되는 프로토타입이 포함되어 있습니다. 참조 형식인 클래스는 기본적으로 In 매개 변수로 전달되므로 이 매개 변수는 InAttributeOutAttribute 특성과 함께 선언되어야 합니다. 호출자가 결과를 받으려면 이 방향 특성이 명시적으로 적용되어야 합니다. App 클래스에서는 SystemTime 클래스의 새 인스턴스를 만들고 해당 데이터 필드에 액세스합니다.

코드 샘플

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

참고 항목

개념

클래스, 구조체 및 공용 구조체 마샬링

플랫폼 호출 데이터 형식

관리 코드에서 프로토타입 만들기