다음을 통해 공유


방법: 콜백 함수 구현

다음 절차와 예제에서는 관리되는 응용 프로그램에서 플랫폼 호출을 사용하여 로컬 컴퓨터의 각 창에 대한 핸들 값을 인쇄하는 방법을 보여 줍니다. 이 절차와 예제에서는 EnumWindows 함수를 사용하여 모든 창을 차례로 거치면서 CallBack이라는 관리되는 콜백 함수로 창의 핸들 값을 인쇄합니다.

콜백 함수를 구현하려면

  1. 함수를 구현하기 전에 먼저 EnumWindows 함수의 시그니처를 확인합니다. EnumWindows의 시그니처는 다음과 같습니다.

    BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
    

    이 함수에 콜백 함수가 필요하다는 것은 시그니처에 있는 lpEnumFunc 인수를 보면 알 수 있습니다. 일반적으로 콜백 함수에 대한 포인터를 갖는 인수의 이름에는 lp (long pointer) 접두사와 Func 접미사가 붙습니다. Win32 함수에 대한 설명서는 Microsoft Platform SDK에 제공됩니다.

  2. 관리되는 콜백 함수를 만듭니다. 예제에서는 두 개의 인수(hwndlparam)를 사용하는 CallBack이라는 대리자 형식을 선언합니다. 첫째 인수는 창에 대한 핸들이고, 둘째 인수는 응용 프로그램에서 정의합니다. 이 릴리스에서는 두 인수가 모두 정수여야 합니다.

    일반적으로 콜백 함수는 성공했을 때는 0이 아닌 숫자를 반환하고, 실패했을 때는 0을 반환합니다. 이 예제에서는 열거형을 계속하기 위해 반환 값이 true로 설정되었습니다.

  3. 대리자를 만들어 EnumWindows 함수에 대한 인수로 전달합니다. 플랫폼 호출은 자동으로 이 대리자를 익숙한 콜백 형식으로 변환합니다.

  4. 콜백 함수가 작업을 완료한 후에 가비지 수집기가 대리자를 회수해야 합니다. 대리자를 매개 변수로 전달하거나 구조체에 필드로 포함된 대리자를 전달하면 호출되는 동안에는 대리자가 수집되지 않습니다. 다음 열거형 예제에서 볼 수 있듯이, 호출이 반환되기 전에 콜백 함수는 작업을 완료하고 관리되는 호출자에 의한 추가 작업을 요구하지 않습니다.

    그러나 호출이 반환된 후에 콜백 함수가 호출될 수 있는 경우, 관리되는 호출자는 콜백 함수가 완료될 때까지 대리자가 수집되지 않도록 조치를 취해야 합니다. 가비지 수집을 막는 데 대한 자세한 내용은 플랫폼 호출과 함께 Interop 마샬링을 참조하십시오.

예제

Imports System
Imports System.Runtime.InteropServices

Public Delegate Function CallBack( _
hwnd As Integer, lParam As Integer) As Boolean

Public Class EnumReportApp

    Declare Function EnumWindows Lib "user32" ( _
       x As CallBack, y As Integer) As Integer

    Public Shared Sub Main()
        EnumWindows(AddressOf EnumReportApp.Report, 0)
    End Sub 'Main

    Public Shared Function Report(hwnd As Integer, lParam As Integer) _
    As Boolean
        Console.Write("Window handle is ")
        Console.WriteLine(hwnd)
        Return True
    End Function 'Report
End Class 'EnumReportApp
using System;
using System.Runtime.InteropServices;

public delegate bool CallBack(int hwnd, int lParam);

public class EnumReportApp
{
    [DllImport("user32")]
    public static extern int EnumWindows(CallBack x, int y); 

    public static void Main() 
    {
        CallBack myCallBack = new CallBack(EnumReportApp.Report);
        EnumWindows(myCallBack, 0);
    }

    public static bool Report(int hwnd, int lParam)
    { 
        Console.Write("Window handle is ");
        Console.WriteLine(hwnd);
        return true;
    }
}
using namespace System;
using namespace System::Runtime::InteropServices;

// A delegate type.
delegate bool CallBack(int hwnd, int lParam);

// Managed type with the method to call.
ref class EnumReport
{
// Report the window handle.
public:
    [DllImport("user32")]
    static int EnumWindows(CallBack^ x, int y);
    
    static void Main()
    {
        EnumReport^ er = gcnew EnumReport;
        CallBack^ myCallBack = gcnew CallBack(&EnumReport::Report);
        EnumWindows(myCallBack, 0);
    }

    static bool Report(int hwnd, int lParam)
    {
       Console::Write(L"Window handle is ");
       Console::WriteLine(hwnd);
       return true;
    }
};

int main()
{
    EnumReport::Main();
}

참고 항목

개념

콜백 함수

기타 리소스

DLL 함수 호출