2025-11-28 00:35:46 +09:00

110 lines
3.2 KiB
C++

//+---------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// BITS Upload sample
// ==================
//
// Module name:
// util.cpp
//
// Purpose:
// Implementation of auxiliary functions used by the sample.
//
//----------------------------------------------------------------------------
#include <windows.h>
#include <crtdbg.h>
#include <strsafe.h>
#include "util.h"
#include "main.h"
HRESULT DisplayErrorMessage(LPCWSTR pwszAdditionalMsg, HRESULT hrCode)
{
HRESULT hr = S_OK;
HRESULT LookupHr = HRESULT_FROM_WIN32( ERROR_RESOURCE_LANG_NOT_FOUND );
WCHAR wszErrorMessage[512] = { 0 };
WCHAR *pwszBITSErrorMsg = NULL;
if (FAILED(hrCode))
{
//
// Prepare to get a locale-specific error message.
// We we are going to try different LCIDs; depending if this is a localized OS or not,
// we may be able to get localized error messages. Otherwise fall back to English strings.
//
LCID LcidsToTry[] =
{
GetThreadLocale(),
GetUserDefaultLCID(),
GetSystemDefaultLCID(),
MAKELCID( MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US ), 0 )
};
SIZE_T NumberOfLCIDs = ARRAYSIZE(LcidsToTry);
//
// Loop until we run out of LCIDs or until we succeed.
// Note that if the error is not BITS specific, the function will search
// winhttp and the system for a description.
//
for (SIZE_T i = 0;
(( HRESULT_FROM_WIN32( ERROR_RESOURCE_LANG_NOT_FOUND ) == LookupHr ||
HRESULT_FROM_WIN32( ERROR_MR_MID_NOT_FOUND ) == LookupHr)
&& i < NumberOfLCIDs);
i++)
{
LookupHr = g_JobManager->GetErrorDescription(hrCode, LcidsToTry[i], &pwszBITSErrorMsg);
if (SUCCEEDED(LookupHr))
{
break;
}
}
//
// Build the full message that we are going to display to the user.
// Note that maybe we didn't get an error description from BITS after all,
// or the pwszAdditionalMsg parameter given was NULL. We need to test for those.
//
hr = StringCbPrintfW(
wszErrorMessage,
sizeof(wszErrorMessage),
L"%s\n\nThe specific error message returned by the system is: [Error 0x%8.8x] %s\nPlease check the BITS SDK or post a question to the BITS newsgroup if you need \nassistance troubleshooting this issue.",
(pwszAdditionalMsg? pwszAdditionalMsg : L""),
hrCode,
(pwszBITSErrorMsg? pwszBITSErrorMsg : L"")
);
if (FAILED(hr))
{
goto cleanup;
}
MessageBoxW(NULL, wszErrorMessage, L"BITS Upload Sample", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_SETFOREGROUND );
}
cleanup:
return hr;
}
LPCWSTR ConvertGuidToString(REFGUID guid)
{
static WCHAR wszGuid[MAX_GUID_STRING_LENGTH];
if (!StringFromGUID2(guid, wszGuid, MAX_GUID_STRING_LENGTH))
{
wszGuid[0] = L'\0';
}
return reinterpret_cast<WCHAR *>(wszGuid);
}