windows-nt/Source/XPSP1/NT/shell/ext/cscui/msgbox.cpp

332 lines
7.7 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: msgbox.cpp
//
//--------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "msgbox.h"
//
// Helper to report system errors.
// Merely ensures a little consistency with respect to message box
// flags.
//
// Example:
//
// CscWin32Message(hwndMain,
// ERROR_NOT_ENOUGH_MEMORY,
// CSCUI::SEV_ERROR);
//
INT
CscWin32Message(
HWND hwndParent,
DWORD dwError, // From GetLastError().
CSCUI::Severity severity
)
{
UINT uType = MB_OK;
switch(severity)
{
case CSCUI::SEV_ERROR:
uType |= MB_ICONERROR;
break;
case CSCUI::SEV_WARNING:
uType |= MB_ICONWARNING;
break;
case CSCUI::SEV_INFORMATION:
uType |= MB_ICONINFORMATION;
break;
default: break;
}
return CscMessageBox(hwndParent, uType, Win32Error(dwError));
}
INT
CscMBLoadString(
HINSTANCE hInstance,
UINT idStr,
LPTSTR *ppszOut
)
{
int cch = 0;
TCHAR szBuffer[MAX_PATH];
int cchResource = SizeofStringResource(hInstance, idStr);
if (0 < cchResource)
{
cchResource++; // Add for nul term.
*ppszOut = (LPTSTR)LocalAlloc(LMEM_FIXED, cchResource * sizeof(TCHAR));
if (NULL != *ppszOut)
{
cch = LoadString(hInstance, idStr, *ppszOut, cchResource);
if (0 == cch)
{
LocalFree(*ppszOut);
*ppszOut = NULL;
}
}
}
return cch;
}
INT
CscMBFormatMessage(
HINSTANCE hInstance,
UINT idStr,
LPTSTR *ppszOut,
va_list *pargs
)
{
INT iResult = -1;
LPTSTR pszFmt = NULL;
int cchLoaded = CscMBLoadString(hInstance, idStr, &pszFmt);
if (0 == cchLoaded)
{
TraceMsg("String resource error");
throw "resource error"; // Don't want to return a value.
}
cchLoaded = ::FormatMessage(FORMAT_MESSAGE_FROM_STRING |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
pszFmt,
0,
0,
(LPTSTR)ppszOut,
1,
pargs);
LocalFree(pszFmt);
return cchLoaded;
}
//
// Display a system error message in a message box.
// The Win32Error class was created to eliminate any signature ambiguities
// with the other versions of CscMessageBox.
//
// Example:
//
// CscMessageBox(hwndMain,
// MB_OK | MB_ICONERROR,
// Win32Error(ERROR_NOT_ENOUGH_MEMORY));
//
INT
CscMessageBox(
HWND hwndParent,
UINT uType,
const Win32Error& error
)
{
INT iResult = -1;
LPTSTR pszBuffer = NULL;
INT cchLoaded = ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,
error.Code(),
0,
(LPTSTR)&pszBuffer,
1,
NULL);
if (0 == cchLoaded)
{
TraceMsg("String resource error");
throw "resource error"; // Don't want to return a value.
}
if (NULL != pszBuffer)
{
iResult = CscMessageBox(hwndParent, uType, pszBuffer);
LocalFree(pszBuffer);
}
return iResult;
}
//
// Display a system error message in a message box with additional
// text.
//
// Example:
//
// CscMessageBox(hwndMain,
// MB_OK | MB_ICONERROR,
// Win32Error(ERROR_NOT_ENOUGH_MEMORY),
// IDS_FMT_LOADINGFILE,
// pszFile);
//
INT
CscMessageBox(
HWND hwndParent,
UINT uType,
const Win32Error& error,
LPCTSTR pszMsgText
)
{
INT iResult = -1;
int cchMsg = lstrlen(pszMsgText);
LPTSTR pszBuffer = (LPTSTR)LocalAlloc(LMEM_FIXED, (cchMsg + MAX_PATH) * sizeof(TCHAR));
if (NULL != pszBuffer)
{
lstrcpy(pszBuffer, pszMsgText);
*(pszBuffer + cchMsg++) = TEXT('\n');
*(pszBuffer + cchMsg++) = TEXT('\n');
int cchLoaded = ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
error.Code(),
0,
pszBuffer + cchMsg,
MAX_PATH - 2, // 2 for newlines.
NULL);
if (0 != cchLoaded)
{
iResult = CscMessageBox(hwndParent, uType, pszBuffer);
}
LocalFree(pszBuffer);
}
return iResult;
}
INT
CscMessageBox(
HWND hwndParent,
UINT uType,
const Win32Error& error,
HINSTANCE hInstance,
UINT idMsgText,
va_list *pargs
)
{
INT iResult = -1;
LPTSTR pszBuffer = NULL;
int cchLoaded = CscMBFormatMessage(hInstance,
idMsgText,
&pszBuffer,
pargs);
if (0 == cchLoaded)
{
TraceMsg("String resource error");
throw "resource error"; // Don't want to return a value.
}
iResult = CscMessageBox(hwndParent, uType, error, pszBuffer);
LocalFree(pszBuffer);
return iResult;
}
INT
CscMessageBox(
HWND hwndParent,
UINT uType,
const Win32Error& error,
HINSTANCE hInstance,
UINT idMsgText,
...
)
{
INT iResult = -1;
va_list args;
va_start(args, idMsgText);
iResult = CscMessageBox(hwndParent, uType, error, hInstance, idMsgText, &args);
va_end(args);
return iResult;
}
//
// Example:
//
// CscMessageBox(hwndMain,
// MB_OK | MB_ICONWARNING,
// TEXT("File %1 could not be deleted"), pszFilename);
//
INT
CscMessageBox(
HWND hwndParent,
UINT uType,
HINSTANCE hInstance,
UINT idMsgText,
va_list *pargs
)
{
INT iResult = -1;
LPTSTR pszFmt = NULL;
int cchLoaded = CscMBLoadString(hInstance, idMsgText, &pszFmt);
if (0 == cchLoaded)
{
TraceMsg("String resource error");
throw "resource error"; // Don't want to return a value.
}
LPTSTR pszMsg = NULL;
cchLoaded = ::FormatMessage(FORMAT_MESSAGE_FROM_STRING |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
pszFmt,
0,
0,
(LPTSTR)&pszMsg,
1,
pargs);
LocalFree(pszFmt);
if (0 == cchLoaded)
{
TraceMsg("String resource error");
throw "resource error"; // Don't want to return a value.
}
iResult = CscMessageBox(hwndParent, uType, pszMsg);
LocalFree(pszMsg);
return iResult;
}
INT
CscMessageBox(
HWND hwndParent,
UINT uType,
HINSTANCE hInstance,
UINT idMsgText,
...
)
{
INT iResult = -1;
va_list args;
va_start(args, idMsgText);
iResult = CscMessageBox(hwndParent, uType, hInstance, idMsgText, &args);
va_end(args);
return iResult;
}
//
// All of the other variations of CscMessageBox() end up calling this one.
//
INT
CscMessageBox(
HWND hwndParent,
UINT uType,
LPCTSTR pszMsgText
)
{
TCHAR szCaption[80] = { TEXT('\0') };
LoadString(g_hInstance, IDS_APPLICATION, szCaption, ARRAYSIZE(szCaption));
return MessageBox(hwndParent, pszMsgText, szCaption, uType);
}