Erstellen von Status Rückruf Funktionen
In diesem Tutorial wird beschrieben, wie Sie eine Status Rückruffunktion erstellen, die zum Überwachen des Status einer Internet Anforderung verwendet wird.
Status Rückruf Funktionen empfangen Status Rückrufe für alle Internet Anforderungen, die aus einer beliebigen Wininet-Funktion stammen, der ein Kontextwert ungleich NULL weitergegeben wurde.
Die folgenden Schritte sind erforderlich, um eine Status Rückruffunktion zu erstellen:
Definieren des Kontext Werts
Der Kontextwert kann ein beliebiger ganzzahliger Wert ohne Vorzeichen sein. Im Idealfall sollte der Kontextwert feststellen, welche Anforderung gerade abgeschlossen wurde, und den Speicherort der zugeordneten Ressourcen bei Bedarf ermitteln.
Eine der nützlichsten Möglichkeiten, den Kontextwert zu verwenden, besteht darin, die Adresse einer Struktur zu übergeben und in ein DWORD- _ ptr umzuwandeln. Die-Struktur kann zum Speichern von Informationen über die Anforderung verwendet werden, damit diese an die Status Rückruffunktion übermittelt werden.
Die folgende Struktur ist ein Beispiel für einen möglichen Kontextwert. Die Member der Struktur werden mit der Internet OpenURL -Funktion ausgewählt.
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 diesem Beispiel hätte die Status Rückruffunktion Zugriff auf das Fenster Handle, das es Ihnen ermöglicht, eine Benutzeroberfläche anzuzeigen. Das von InternetOpenUrl erstellte HINTERNET Handle kann an eine andere Funktion übergeben werden, die die Ressource herunterladen kann, sowie ein Zeichen Array, das zum Übergeben von Informationen über die Anforderung verwendet werden kann.
Die Elemente der Struktur können so geändert werden, dass Sie den Anforderungen einer bestimmten Anwendung entsprechen. Deshalb ist dieses Beispiel nicht eingeschränkt.
Erstellen der Status Rückruffunktion
Die Status Rückruffunktion muss das Format " internetstatuscallback" aufweisen. Gehen Sie dazu wie folgt vor:
Schreiben Sie eine Funktionsdeklaration für die Status Rückruffunktion.
Das folgende Beispiel zeigt eine Beispiel Deklaration.
void CALLBACK CallMaster( HINTERNET, DWORD_PTR, DWORD, LPVOID, DWORD );Legen Sie fest, welche Aktion die Status Rückruffunktion durchführt. Bei Anwendungen, die asynchrone Aufrufe durchführen, muss die Status Rückruffunktion den Complete-Wert der Internet _ Status _ Anforderung verarbeiten, der _ angibt, dass eine asynchrone Anforderung beendet wurde. Die Status Rückruffunktion kann auch verwendet werden, um den Fortschritt einer Internet Anforderung zu verfolgen.
Im Allgemeinen funktioniert es am besten, wenn eine Switch-Anweisung mit dwinternetstatus als switchwert und die Statuswerte für die Case-Anweisungen verwendet werden. Abhängig von den Funktionstypen, die von der Anwendung aufgerufen werden, können Sie einige der Statuswerte ignorieren. Eine Definition der verschiedenen Statuswerte finden Sie in der Liste unter dem dwinternetstatus -Parameter von internetstatuscallback.
Die folgende Switch-Anweisung ist ein Beispiel für das Behandeln von Status Rückrufen.
switch (dwInternetStatus) { case INTERNET_STATUS_REQUEST_COMPLETE: // Add code break; default: // Add code break; }Erstellen Sie den Code, um die Statuswerte zu verarbeiten.
Der Code zum Verarbeiten der einzelnen Statuswerte hängt stark von der vorgesehenen Verwendung der Status Rückruffunktion ab. Bei Anwendungen, die nur den Status einer Anforderung nachverfolgen, benötigen Sie möglicherweise nur eine Zeichenfolge in ein Listenfeld. Für asynchrone Vorgänge muss der Code einige der im Rückruf zurückgegebenen Daten verarbeiten.
Die folgende Status Rückruffunktion verwendet eine Switch-Funktion, um den Statuswert zu bestimmen, und erstellt eine Zeichenfolge, die den Namen des Status Werts und die vorherige Funktion mit dem Namen enthält, die im szmemo-Member der Anforderungs _ Kontext Struktur gespeichert wird.
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 ); }Verwenden Sie die internetsetstatuscallback -Funktion, um die Status Rückruffunktion für das hinternethandle festzulegen, für das Sie Status Rückrufe empfangen möchten.
Im folgenden Beispiel wird veranschaulicht, wie eine Status Rückruffunktion festgelegt wird.
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 );
Hinweis
WinInet unterstützt keine Server Implementierungen. Außerdem sollte Sie nicht von einem Dienst verwendet werden. Verwenden Sie für Server Implementierungen oder-Dienste Microsoft Windows HTTP-Dienste (WinHTTP).