Delen via


Status callback-functies maken

In deze handleiding wordt beschreven hoe u een status-terugbelfunctie maakt die wordt gebruikt om de status van een internetaanvraag te bewaken.

Status-callbackfuncties ontvangen statusmeldingen voor internetverzoeken die afkomstig zijn van een WinINet-functie met een niet-nul contextwaarde.

De volgende stappen zijn nodig voor het maken van een status callback-functie:

  1. De contextwaarde definiƫren.
  2. de functie Status callback maken.

De contextwaarde definiƫren

De contextwaarde kan elke niet-ondertekende lange gehele waarde zijn. In het ideale geval moet de contextwaarde bepalen welke aanvraag zojuist is voltooid en de locatie van alle gekoppelde resources, indien nodig.

Een van de handigste manieren om de contextwaarde te gebruiken, is door het adres van een structuur door te geven en naar een DWORD_PTRte casten. De structuur kan worden gebruikt om informatie over de aanvraag op te slaan, zodat deze wordt doorgegeven aan de functie status callback.

De volgende structuur is een voorbeeld van een mogelijke contextwaarde. De leden van de structuur worden gekozen met de InternetOpenUrl functie in gedachten.

typedef struct{
    HWND       hWindow;      // Window handle
    int        nStatusList;  // List box control to hold callbacks
    HINTERNET  hResource;    // HINTERNET handle created by InternetOpenUrl
    char       szMemo[512];  // String to store status memo
} REQUEST_CONTEXT;

In dit voorbeeld heeft de functie status callback toegang tot de venstergreep, waardoor een gebruikersinterface kan worden weergegeven. De HINTERNET ingang die is gemaakt door InternetOpenUrl kan worden doorgegeven aan een andere functie die de resource en een tekenreeks kan downloaden die kan worden gebruikt om informatie over de aanvraag door te geven.

De leden van de structuur kunnen worden aangepast aan de behoeften van een bepaalde toepassing, dus voelt u zich niet beperkt door dit voorbeeld.

De functie Status callback maken

De functie statusaanroep moet de indeling van InternetStatusCallbackvolgen. U doet dit als volgt:

  1. Schrijf een functiedeclaratie voor uw status callback-functie.

    In het volgende voorbeeld ziet u een voorbeelddeclaratie.

    void CALLBACK CallMaster( HINTERNET,
                              DWORD_PTR,
                              DWORD,
                              LPVOID,
                              DWORD );
    
  2. Bepaal wat uw statuscallback-functie zal doen. Voor toepassingen die asynchrone aanroepen maken, moet de statusaanroepfunctie de INTERNET_STATUS_REQUEST_COMPLETE-waarde verwerken, wat aangeeft dat een asynchrone aanvraag is voltooid. De functie statusaanroep kan ook worden gebruikt om de voortgang van een internetaanvraag bij te houden.

    Over het algemeen werkt het het beste om een switch-instructie te gebruiken met dwInternetStatus als de switchwaarde en de statuswaarden voor de case-instructies. Afhankelijk van de typen functies die uw toepassing aanroept, kunt u enkele statuswaarden negeren. Zie de vermelding onder de dwInternetStatus parameter van InternetStatusCallbackvoor een definitie van de verschillende statuswaarden.

    De volgende switch-instructie is een voorbeeld van het afhandelen van status callbacks.

    switch (dwInternetStatus)
    {
        case INTERNET_STATUS_REQUEST_COMPLETE:
            // Add code
            break;
        default:
            // Add code
            break;
    }
    
  3. Maak de code om de statuswaarden te verwerken.

    De code voor het afhandelen van elk van de statuswaarden is sterk afhankelijk van het beoogde gebruik van de functie status callback. Voor toepassingen die alleen de voortgang van een aanvraag bijhouden, is het schrijven van een tekenreeks naar een lijstvak wellicht alles wat u nodig heeft. Voor asynchrone bewerkingen moet de code enkele gegevens verwerken die in de callback worden geretourneerd.

    De volgende functie voor terugbellen van status maakt gebruik van een schakelfunctie om te bepalen wat de statuswaarde is en maakt een tekenreeks met de naam van de statuswaarde en de vorige functie die wordt aangeroepen, die wordt opgeslagen in het szMemo-lid van de REQUEST_CONTEXT-structuur.

    void __stdcall CallMaster(
        HINTERNET hInternet,
        DWORD_PTR dwContext,
        DWORD dwInternetStatus,
        LPVOID lpvStatusInformation,
        DWORD dwStatusInformationLength
    )
    {
        UNREFERENCED_PARAMETER(hInternet);
        UNREFERENCED_PARAMETER(lpvStatusInformation);
        UNREFERENCED_PARAMETER(dwStatusInformationLength);
    
        REQUEST_CONTEXT *cpContext;
        cpContext = (REQUEST_CONTEXT*)dwContext;
        char szStatusText[80];
    
        switch (dwInternetStatus)
        {
            case INTERNET_STATUS_CLOSING_CONNECTION:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s CLOSING_CONNECTION",
                                  cpContext->szMemo);
                break;
            case INTERNET_STATUS_CONNECTED_TO_SERVER:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s CONNECTED_TO_SERVER",
                                  cpContext->szMemo );
                break;
            case INTERNET_STATUS_CONNECTING_TO_SERVER:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s CONNECTING_TO_SERVER",
                                  cpContext->szMemo );
                break;
            case INTERNET_STATUS_CONNECTION_CLOSED:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s CONNECTION_CLOSED",
                                  cpContext->szMemo );
                break;
            case INTERNET_STATUS_HANDLE_CLOSING:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s HANDLE_CLOSING",
                                  cpContext->szMemo );
                break;
            case INTERNET_STATUS_HANDLE_CREATED:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s HANDLE_CREATED",
                                  cpContext->szMemo);
                break;
            case INTERNET_STATUS_INTERMEDIATE_RESPONSE:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s INTERMEDIATE_RESPONSE",
                                  cpContext->szMemo );
                break;
            case INTERNET_STATUS_NAME_RESOLVED:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s NAME_RESOLVED",
                                  cpContext->szMemo);
                break;
            case INTERNET_STATUS_RECEIVING_RESPONSE:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s RECEIVING_RESPONSE",
                                  cpContext->szMemo);
                break;
            case INTERNET_STATUS_RESPONSE_RECEIVED:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s RESPONSE_RECEIVED",
                                  cpContext->szMemo);
                break;
            case INTERNET_STATUS_REDIRECT:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s REDIRECT",
                                  cpContext->szMemo );
                break;
            case INTERNET_STATUS_REQUEST_COMPLETE:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s REQUEST_COMPLETE",
                                  cpContext->szMemo);
                break;
            case INTERNET_STATUS_REQUEST_SENT:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s REQUEST_SENT",
                                  cpContext->szMemo);
                break;
            case INTERNET_STATUS_RESOLVING_NAME:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s RESOLVING_NAME",
                                  cpContext->szMemo );
                break;
            case INTERNET_STATUS_SENDING_REQUEST:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s SENDING_REQUEST",
                                  cpContext->szMemo );
                break;
            case INTERNET_STATUS_STATE_CHANGE:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s STATE_CHANGE",
                                  cpContext->szMemo );
                break;
            default:
                StringCchPrintfA( szStatusText,
                                  80,
                                  "%s Unknown Status %d Given",
                                  cpContext->szMemo,
                                  dwInternetStatus);
                break;
        }
    
        SendDlgItemMessage( cpContext->hWindow,
                          cpContext->nStatusList,
                          LB_ADDSTRING,
                          0, (LPARAM)szStatusText );
    
    }
    
  4. Gebruik de functie InternetSetStatusCallback om de functie status callback in te stellen op de ACHTERNET- handle waarvoor u status callbacks wilt ontvangen.

    In het volgende voorbeeld ziet u hoe u een statusaanroepfunctie instelt.

    HINTERNET hOpen;                       // Root HINTERNET handle
    INTERNET_STATUS_CALLBACK iscCallback;  // Holds the callback function
    
    // Create the root HINTERNET handle.
    hOpen = InternetOpen( TEXT("Test Application"),
                          INTERNET_OPEN_TYPE_PRECONFIG,
                          NULL, NULL, 0);
    
    // Set the status callback function.
    iscCallback = InternetSetStatusCallback( hOpen, (INTERNET_STATUS_CALLBACK)CallMaster );
    

Notitie

WinINet biedt geen ondersteuning voor serverimplementaties. Daarnaast mag deze niet worden gebruikt vanuit een service. Voor server-implementaties of -services wordt Microsoft Windows HTTP Services (WinHTTP)gebruikt.

 

Status callback-functies maken

InternetSetStatusCallback

InternetStatusCallback