events
エラーの処理 (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) を使用します。
その他のリソース
トレーニング
モジュール
Dynamics 365 Business Central でのアプリケーション言語を使用したエラー処理 - Training
Dynamics 365 Business Central でアプリケーション言語 (AL) を使用してエラーを処理する方法を学びます。
ドキュメント
-
InternetGetLastResponseInfoA 関数 (wininet.h) - Win32 apps
この関数を呼び出すスレッドの最後のエラー記述またはサーバー応答を取得します。 (ANSI)
-
次の例では、要求を非同期に送信する方法を示しました。
-
InternetConnectW 関数 (wininet.h) - Win32 apps
特定のサイトのファイル転送プロトコル (FTP) または HTTP セッションを開きます。 (Unicode)