处理 Windows Internet) (错误
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 Services (WinHTTP) 。