오류 처리(Windows 인터넷)
GetLastError 함수는 모든 WinINet 함수에 대한 마지막 오류 코드를 검색합니다. ERROR_INTERNET_EXTENDED_ERROR 반환되면 자세한 오류 메시지가 포함된 문자열 또는 버퍼가 있습니다. InternetGetLastResponseInfo 함수를 호출하여 확장된 오류 텍스트를 검색합니다.
오류에 대한 오류 텍스트를 가져오려면 FormatMessage 함수를 호출하여 GetModuleHandle 함수를 사용하여 가져올 수 있는 Wininet.dll HMODULE 핸들을 전달합니다.
다음은 오류 처리 함수의 예입니다.
#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은 서버 구현을 지원하지 않습니다. 또한 서비스에서 사용하면 안 됩니다. 서버 구현 또는 서비스의 경우 WinHTTP(Microsoft Windows HTTP 서비스)를 사용합니다.