WinHttpSetStatusCallback 함수(winhttp.h)

WinHttpSetStatusCallback 함수는 작업 중에 진행이 수행되면 WinHTTP가 호출할 수 있는 콜백 함수를 설정합니다.

구문

WINHTTPAPI WINHTTP_STATUS_CALLBACK WinHttpSetStatusCallback(
  [in] HINTERNET               hInternet,
  [in] WINHTTP_STATUS_CALLBACK lpfnInternetCallback,
  [in] DWORD                   dwNotificationFlags,
  [in] DWORD_PTR               dwReserved
);

매개 변수

[in] hInternet

콜백을 설정할 HINTERNET 핸들입니다.

[in] lpfnInternetCallback

진행이 이루어질 때 호출할 콜백 함수에 대한 포인터입니다. 기존 콜백 함수를 제거하려면 NULL 로 설정합니다. 콜백 함수에 대한 자세한 내용은 WINHTTP_STATUS_CALLBACK 참조하세요.

[in] dwNotificationFlags

콜백 함수를 활성화하는 이벤트를 나타내는 플래그를 지정하는 부호 없는 긴 정수 값입니다.

가능한 값은 다음과 같습니다.

의미
WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS
완료 알림이 있으면 활성화됩니다. 이 플래그는 읽기 또는 쓰기 작업에 필요한 모든 알림이 사용되도록 지정합니다. 완료 목록은 WINHTTP_STATUS_CALLBACK 참조하세요.
WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS
완료를 포함하여 상태 변경 알림을 활성화합니다. 알림 목록은 WINHTTP_STATUS_CALLBACK 참조하세요.
WINHTTP_CALLBACK_FLAG_RESOLVE_NAME
이름 확인을 시작하고 완료할 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_CONNECT_TO_SERVER
서버에 대한 연결을 시작하고 완료할 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_DETECTING_PROXY
프록시 서버를 검색할 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_DATA_AVAILABLE
데이터에 대한 쿼리를 완료할 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_HEADERS_AVAILABLE
응답 헤더를 검색할 수 있는 경우 활성화됩니다.
WINHTTP_CALLBACK_FLAG_READ_COMPLETE
데이터 읽기 작업이 완료되면 활성화됩니다.
WINHTTP_CALLBACK_FLAG_REQUEST_ERROR
비동기 오류가 발생할 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_SEND_REQUEST
WinHttpSendRequest를 사용하여 요청 헤더 보내기를 시작하고 완료할 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_SENDREQUEST_COMPLETE
WinHttpSendRequest를 사용하여 요청 헤더를 보낸 경우 활성화됩니다.
WINHTTP_CALLBACK_FLAG_WRITE_COMPLETE
데이터 포스트 작업이 완료되면 활성화됩니다.
WINHTTP_CALLBACK_FLAG_RECEIVE_RESPONSE
HTTP 서버에서 리소스 수신을 시작하고 완료할 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_CLOSE_CONNECTION
HTTP 연결의 닫기를 시작하고 완료할 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_HANDLES
HINTERNET 핸들을 만들거나 닫을 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_REDIRECT
요청이 리디렉션될 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_INTERMEDIATE_RESPONSE
서버에서 중간(100 수준) 상태 코드 메시지를 받을 때 활성화됩니다.
WINHTTP_CALLBACK_FLAG_SECURE_FAILURE
보안 연결 실패 시 활성화됩니다.

[in] dwReserved

이 매개 변수는 예약되어 있으며 NULL이어야 합니다.

반환 값

성공하면 이전에 정의된 상태 콜백 함수가 없는 경우 이전에 정의된 상태 콜백 함수 또는 NULL에 대한 포인터를 반환합니다. 콜백 함수를 설치할 수 없는 경우 WINHTTP_INVALID_STATUS_CALLBACK 반환합니다. 확장된 오류 정보는 GetLastError를 호출합니다. 반환된 오류 코드 중에는 다음과 같습니다.

오류 코드 Description
ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
이 작업에 대해 제공된 핸들의 형식이 올바르지 않습니다.
ERROR_WINHTTP_INTERNAL_ERROR
내부 오류가 발생했습니다.
ERROR_NOT_ENOUGH_MEMORY
메모리가 부족하여 요청된 작업을 완료할 수 없습니다. (Windows 오류 코드)

설명

요청 핸들을 만들기 전에 세션 핸들에서 콜백을 설정하는 경우 요청 핸들은 부모 세션에서 콜백 함수 포인터를 상속합니다.

WinHTTP가 비동기 모드(즉, WinHttpOpen에서 WINHTTP_FLAG_ASYNC 설정된 경우)에서 사용되는 경우에도 이 함수는 동기적으로 작동합니다. 반환 값은 성공 또는 실패를 나타냅니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

동기 함수와 비동기 함수는 모두 콜백 함수를 사용하여 이름 확인, 서버 연결 등과 같은 요청 진행률을 나타냅니다. 콜백 함수는 비동기 작업에 필요합니다.

콜백 함수는 모든 핸들에서 설정할 수 있으며 파생 핸들에서 상속됩니다. 이전 콜백 값을 사용해야 하는 보류 중인 요청이 없는 경우 WinHttpSetStatusCallback을 사용하여 콜백 함수를 변경할 수 있습니다. 그러나 핸들에서 콜백 함수를 변경해도 WinHttpConnect에서 반환되는 것과 같은 파생 핸들의 콜백은 변경되지 않습니다. 각 수준에서 콜백 함수를 변경해야 합니다.

많은 WinHTTP 함수는 네트워크에서 여러 작업을 수행합니다. 각 작업을 완료하는 데 시간이 걸릴 수 있으며 각각이 실패할 수 있습니다.

WinHttpSetStatusCallback 함수를 시작한 후 시간이 많이 걸리는 네트워크 작업을 모니터링하기 위해 WinHTTP 내에서 콜백 함수에 액세스할 수 있습니다.

비동기 처리가 끝나면 애플리케이션에서 콜백 함수를 NULL로 설정할 수 있습니다. 이렇게 하면 클라이언트 애플리케이션이 추가 알림을 받을 수 없습니다.

다음 코드 조각은 콜백 함수를 NULL로 설정하는 데 권장되는 방법을 보여줍니다.

WinHttpSetStatusCallback( hOpen,
                          NULL,
                          WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,
                          NULL );

그러나 WinHTTP는 WinHttpSetStatusCallback 을 작업자 스레드와 동기화하지 않습니다. 애플리케이션이 WinHttpSetStatusCallback을 호출할 때 다른 스레드에서 시작된 콜백이 진행 중인 경우 WinHttpSetStatusCallback 이 콜백 함수를 NULL 로 설정하고 반환한 후에도 애플리케이션은 여전히 콜백 알림을 받습니다.

참고 Windows XP 및 Windows 2000의 경우 WinHttp 시작 페이지의 런타임 요구 사항 섹션을 참조하세요.
 

예제

다음 예제에서는 비동기 WinHTTP 함수에 대한 콜백 함수를 설치하는 방법을 보여 줍니다. 이 예제에서는 "AsyncCallback( )"이라는 WINHTTP_STATUS_CALLBACK 함수가 이전에 구현되었다고 가정합니다.

    // Use WinHttpOpen to obtain an HINTERNET handle.
    HINTERNET hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0", 
                                    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                                    WINHTTP_NO_PROXY_NAME, 
                                    WINHTTP_NO_PROXY_BYPASS, 0);
    if (hSession)
    {
        // Install the status callback function.
        WINHTTP_STATUS_CALLBACK isCallback = WinHttpSetStatusCallback( hSession,
                                               (WINHTTP_STATUS_CALLBACK)AsyncCallback,
                                               WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 
                                               NULL);
                                               
        // Place additional code here.
    
        // When finished, release the HINTERNET handle.
        WinHttpCloseHandle(hSession);
    }
    else
    {
        printf("Error %u in WinHttpOpen.\n", GetLastError());
    }

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP, Windows 2000 Professional SP3 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003, Windows 2000 Server SP3 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 winhttp.h
라이브러리 Winhttp.lib
DLL Winhttp.dll
재배포 가능 파일 Windows XP 및 Windows 2000에서 WinHTTP 5.0 및 인터넷 Explorer 5.01 이상.

추가 정보

Microsoft Windows HTTP 서비스 정보(WinHTTP)

WINHTTP_STATUS_CALLBACK

WinHTTP 버전

WinHttpConnect

WinHttpOpen