處理 Windows 網際網路 (錯誤)
GetLastError函式會擷取所有 WinINet 函式的最後一個錯誤碼。 如果 傳回ERROR_INTERNET_EXTENDED_ERROR ,則有包含詳細錯誤訊息的字串或緩衝區。 呼叫 InternetGetLastResponseInfo 函式以擷取擴充的錯誤文字。
若要取得錯誤的錯誤文字,請呼叫 FormatMessage 函式,將 HMODULE 控制碼傳遞至 Wininet.dll,這可以使用 GetModuleHandle 函式取得。
以下是錯誤處理函式的範例。
#include <windows.h>
#include "strsafe.h"
#include "wininet.h"
#include <stdlib.h>
#pragma comment(lib, "wininet.lib")
#pragma comment(lib, "user32.lib")
#define INET_ERR_OUT_MSG_BOX_BUFFER_SIZE 512
#define INET_ERR_OUT_FORMAT_BUFFER_SIZE 256
#ifdef _UNICODE
#define _itot _itow_s
#else
#define _itot _itoa_s
#endif
// Forward declaration of helper function
void WINAPI addLastErrorToMsg( LPTSTR szMsgBuffer, DWORD dwSize );
// Function for displaying Internet Error information in a message box
BOOL WINAPI InternetErrorOut(
HWND hWnd,
DWORD dwError,
LPCTSTR szFailingFunctionName )
{
HANDLE hProcHeap;
TCHAR szMsgBoxBuffer[INET_ERR_OUT_MSG_BOX_BUFFER_SIZE],
szFormatBuffer[INET_ERR_OUT_FORMAT_BUFFER_SIZE],
szConnectiveText[] = { TEXT( "\nAdditional Information: " )},
*szExtErrMsg = NULL,
*szCombinedErrMsg = NULL;
DWORD dwInetError,
dwBaseLength,
dwExtLength = 0;
if( ( hProcHeap = GetProcessHeap( ) ) == NULL )
{
StringCchCopy( szMsgBoxBuffer, INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
TEXT( "Call to GetProcessHeap( ) failed..." ) );
goto InetErrorOutError_1;
}
dwBaseLength = FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE, // dwFlags
GetModuleHandle( TEXT("wininet.dll") ), // lpSource
dwError, // dwMessageId
0, // dwLanguageId
(LPTSTR)szFormatBuffer, // lpBuffer
INET_ERR_OUT_FORMAT_BUFFER_SIZE, // nSize
NULL ); // * arguments
if( !dwBaseLength )
{
StringCchCopy( szMsgBoxBuffer, INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
TEXT( "Call to FormatMessage( ) failed..." ) );
addLastErrorToMsg( szMsgBoxBuffer,
INET_ERR_OUT_MSG_BOX_BUFFER_SIZE );
goto InetErrorOutError_1;
}
if( FAILED( StringCchPrintf( szMsgBoxBuffer,
INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
TEXT( "%s error; code: %d\nDescription: %s\n" ),
szFailingFunctionName, dwError, szFormatBuffer ) ) )
{
StringCchCopy( szMsgBoxBuffer, INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
TEXT( "Call to StringCchPrintf( ) failed...\n" ) );
goto InetErrorOutError_1;
}
StringCchLength( szMsgBoxBuffer, INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
(size_t*) &dwBaseLength );
// Adjust base-length value to count the number of bytes:
dwBaseLength *= sizeof( TCHAR );
if( dwError == ERROR_INTERNET_EXTENDED_ERROR )
{
InternetGetLastResponseInfo( &dwInetError, NULL, &dwExtLength );
// Adjust the extended-length value to a byte count
// that includes the terminating null:
++dwExtLength *= sizeof( TCHAR );
if( ( szExtErrMsg = (TCHAR*)HeapAlloc( hProcHeap, 0, dwExtLength))
== NULL )
{
StringCchCat( szMsgBoxBuffer, INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
TEXT("\nFailure: Could not allocate buffer for addional details."));
addLastErrorToMsg( szMsgBoxBuffer,
INET_ERR_OUT_MSG_BOX_BUFFER_SIZE );
goto InetErrorOutError_1;
}
if( !InternetGetLastResponseInfo( &dwInetError,
szExtErrMsg,
&dwExtLength ) )
{
StringCchCat( szMsgBoxBuffer, INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
TEXT( "\nCall to InternetGetLastResponseInfo( ) failed--" ) );
addLastErrorToMsg( szMsgBoxBuffer,
INET_ERR_OUT_MSG_BOX_BUFFER_SIZE );
goto InetErrorOutError_2;
}
dwBaseLength += dwExtLength + sizeof( szConnectiveText );
}
if( ( szCombinedErrMsg = (TCHAR*)HeapAlloc( hProcHeap, 0,
dwBaseLength + sizeof(TCHAR) ) )
== NULL )
{
StringCchCat( szMsgBoxBuffer, INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
TEXT( "\nFailure: Could not allocate final output buffer." ) );
addLastErrorToMsg( szMsgBoxBuffer,
INET_ERR_OUT_MSG_BOX_BUFFER_SIZE );
goto InetErrorOutError_2;
}
if( FAILED( StringCchCopy( szCombinedErrMsg,
dwBaseLength, szMsgBoxBuffer ) ) ||
( dwExtLength &&
( FAILED( StringCchCat( szCombinedErrMsg,
dwBaseLength, szConnectiveText ) ) ||
FAILED( StringCchCat( szCombinedErrMsg,
dwBaseLength, szExtErrMsg ) ) ) ) )
{
StringCchCat( szMsgBoxBuffer, INET_ERR_OUT_MSG_BOX_BUFFER_SIZE,
TEXT( "\nFailure: Could not assemble final message." ) );
goto InetErrorOutError_3;
}
MessageBox( hWnd,
szCombinedErrMsg,
TEXT( "Internet Error Message" ),
MB_OK | MB_ICONERROR );
HeapFree( hProcHeap, 0, szExtErrMsg );
HeapFree( hProcHeap, 0, szCombinedErrMsg );
return( TRUE );
InetErrorOutError_3:
HeapFree( hProcHeap, 0, szCombinedErrMsg );
InetErrorOutError_2:
HeapFree( hProcHeap, 0, szExtErrMsg );
InetErrorOutError_1:
MessageBox( hWnd,
(LPCTSTR) szMsgBoxBuffer,
TEXT( "InternetErrorOut( ) Failed" ),
MB_OK | MB_ICONERROR );
return( FALSE );
}
void WINAPI addLastErrorToMsg( LPTSTR szMsgBuffer, DWORD dwSize )
{
TCHAR szNumberBuffer[32];
_itot( GetLastError( ), szNumberBuffer, 10 );
StringCchCat( szMsgBuffer, dwSize,
TEXT( "\n System Error number: " ) );
StringCchCat( szMsgBuffer, dwSize, szNumberBuffer );
StringCchCat( szMsgBuffer, dwSize, TEXT( ".\n" ) );
}
注意
WinINet 不支援伺服器實作。 此外,它不應該從服務使用。 對於伺服器實作或服務,請使用 Microsoft Windows HTTP 服務 (WinHTTP) 。