windows-nt/Source/XPSP1/NT/admin/snapin/eventlog/exestub/errordlg.cxx
2020-09-26 16:20:57 +08:00

484 lines
11 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1998.
//
// File: password.cxx
//
// Contents: Implementation of class used to prompt user for credentials.
//
// Classes: CMessageDlg
//
// History: 06-28-1998 DavidMun Created
//
//---------------------------------------------------------------------------
#include "headers.hxx"
#pragma hdrstop
inline LONG
WindowRectWidth(
const RECT &rc)
{
return rc.right - rc.left;
}
inline LONG
WindowRectHeight(
const RECT &rc)
{
return rc.bottom - rc.top;
}
//+--------------------------------------------------------------------------
//
// Function: PopupMessage
//
// Synopsis: Invoke a modal dialog to display a formatted message string.
//
// Arguments: [idsMessage] - resource id of printf style format string
// [...] - arguments required for string
//
// History: 07-06-1998 DavidMun Created
//
//---------------------------------------------------------------------------
void
PopupMessage(
ULONG idsMessage,
...)
{
va_list valArgs;
va_start(valArgs, idsMessage);
CMessageDlg MessageDlg;
MessageDlg.DoModalDialog(NULL,
IDI_ERROR,
NULL,
0,
0,
idsMessage,
valArgs);
va_end(valArgs);
}
//+--------------------------------------------------------------------------
//
// Function: PopupMessageEx
//
// Synopsis: Invoke a modal dialog to display a formatted message string.
//
// Arguments: [idIcon] - resource identifier of system icon
// [idsMessage] - resource id of printf style format string
// [...] - arguments required for string
//
// History: 07-06-1998 DavidMun Created
//
//---------------------------------------------------------------------------
void
PopupMessageEx(
PCWSTR idIcon,
ULONG idsMessage,
...)
{
va_list valArgs;
va_start(valArgs, idsMessage);
CMessageDlg MessageDlg;
MessageDlg.DoModalDialog(NULL,
idIcon,
NULL,
0,
0,
idsMessage,
valArgs);
va_end(valArgs);
}
//+--------------------------------------------------------------------------
//
// Function: PopupMessageAndCode
//
// Synopsis: Invoke a modal dialog to display a formatted message string
// and error code.
//
// Arguments: [pwzFileName] - error code's file name
// [ulLineNo] - error code's line number
// [hr] - error code's HRESULT
// [idsMessage] - resource id of printf style format string
// [...] - arguments required for string
//
// History: 07-06-1998 DavidMun Created
//
//---------------------------------------------------------------------------
void
PopupMessageAndCode(
PCWSTR pwzFileName,
ULONG ulLineNo,
HRESULT hr,
ULONG idsMessage,
...)
{
va_list valArgs;
va_start(valArgs, idsMessage);
CMessageDlg MessageDlg;
MessageDlg.DoModalDialog(NULL,
IDI_ERROR,
pwzFileName,
ulLineNo,
hr,
idsMessage,
valArgs);
va_end(valArgs);
}
//+--------------------------------------------------------------------------
//
// Function: LoadStr
//
// Synopsis: Load string with resource id [ids] into buffer [wszBuf],
// which is of size [cchBuf] characters.
//
// Arguments: [ids] - string to load
// [wszBuf] - buffer for string
// [cchBuf] - size of buffer
// [wszDefault] - NULL or string to use if load fails
//
// Returns: S_OK or error from LoadString
//
// Modifies: *[wszBuf]
//
// History: 12-11-1996 DavidMun Created
//
// Notes: If the load fails and no default is supplied, [wszBuf] is
// set to an empty string.
//
//---------------------------------------------------------------------------
HRESULT
LoadStr(
ULONG ids,
LPWSTR wszBuf,
ULONG cchBuf,
LPCWSTR wszDefault)
{
HRESULT hr = S_OK;
ULONG cchLoaded;
cchLoaded = LoadString(GetModuleHandle(NULL), ids, wszBuf, cchBuf);
if (!cchLoaded)
{
hr = HRESULT_FROM_WIN32(GetLastError());
if (wszDefault)
{
lstrcpyn(wszBuf, wszDefault, cchBuf);
}
else
{
*wszBuf = L'\0';
}
}
return hr;
}
//+--------------------------------------------------------------------------
//
// Member: CMessageDlg::DoModalDialog
//
// Synopsis: Invoke a modal dialog to display a message.
//
// Arguments: [hinstIcon] - NULL or module handle where icon lives
// [idIcon] - resource identifier of icon to display
// [pwzFile] - error code's file name
// [ulLine] - error code's line number
// [ulErrorCode] - error code's error value
// [idsMessage] - resource id of printf style format string
// [valArgs] - arguments required for string
//
// Returns: HRESULT
//
// History: 07-06-1998 DavidMun Created
//
//---------------------------------------------------------------------------
INT_PTR
CMessageDlg::DoModalDialog(
HINSTANCE hinstIcon,
PCWSTR idIcon,
PCWSTR pwzFile,
ULONG ulLine,
ULONG ulErrorCode,
ULONG idsMessage,
va_list valArgs)
{
m_hinstIcon = hinstIcon;
m_idIcon = idIcon;
if (pwzFile)
{
wsprintf(m_wzErrorCode, L"%ws %u %x", pwzFile, ulLine, ulErrorCode);
}
WCHAR wzMessageFmt[MAX_PATH];
LoadStr(idsMessage, wzMessageFmt, MAX_PATH, L"");
PWSTR pwzTemp = NULL;
ULONG ulResult;
ulResult = FormatMessageW(FORMAT_MESSAGE_FROM_STRING
| FORMAT_MESSAGE_ALLOCATE_BUFFER,
wzMessageFmt,
0,
0,
(LPWSTR) &pwzTemp,
0,
&valArgs);
if (ulResult)
{
m_pwzMessage = new WCHAR[lstrlen(pwzTemp) + 1];
lstrcpy(m_pwzMessage, pwzTemp);
LocalFree(pwzTemp);
}
return _DoModalDlg(NULL, IDD_ERROR);
}
//+--------------------------------------------------------------------------
//
// Member: CMessageDlg::_OnInit
//
// Synopsis: Initialize dialog controls
//
// Arguments: [pfSetFocus] - unused
//
// Returns: S_OK
//
// History: 06-28-1998 DavidMun Created
//
//---------------------------------------------------------------------------
HRESULT
CMessageDlg::_OnInit(
bool *pfSetFocus)
{
//
// The error dialog has these components:
//
// 1. caption
// 2. icon
// 3. error message
// 4. error code
//
// The last is optional.
//
//
// Set the icon.
//
HICON hIcon = LoadIcon(m_hinstIcon, m_idIcon);
if (hIcon)
{
SendDlgItemMessage(m_hwnd,
IDC_POPUP_MSG_ICON,
STM_SETICON,
(WPARAM)hIcon,
0L);
}
//
// Set the error message static
//
Static_SetText(_hCtrl(IDC_ERRORMSG), m_pwzMessage);
//
// If there is an error code string, set it, otherwise hide
// the edit control and its label and resize the dialog to
// eliminate the empty space.
//
if (*m_wzErrorCode)
{
Static_SetText(_hCtrl(IDC_ERROR_CODE_EDIT), m_wzErrorCode);
}
else
{
EnableWindow(_hCtrl(IDC_ERROR_CODE_LBL), false);
EnableWindow(_hCtrl(IDC_ERROR_CODE_EDIT), false);
ShowWindow(_hCtrl(IDC_ERROR_CODE_LBL), SW_HIDE);
ShowWindow(_hCtrl(IDC_ERROR_CODE_EDIT), SW_HIDE);
RECT rcClose;
RECT rcEdit;
_GetChildWindowRect(_hCtrl(IDCANCEL), &rcClose);
_GetChildWindowRect(_hCtrl(IDC_ERROR_CODE_EDIT), &rcEdit);
//
// Move the Close button up on top of the hidden edit control
//
SetWindowPos(_hCtrl(IDCANCEL),
NULL,
rcClose.left,
rcEdit.top,
0,
0,
SWP_NOSIZE | SWP_NOZORDER);
//
// Shrink the dialog vertically by the amount the button was
// moved up
//
LONG cyDelta = rcClose.top - rcEdit.top;
RECT rcDialog;
GetWindowRect(m_hwnd, &rcDialog);
SetWindowPos(m_hwnd,
NULL,
0,
0,
WindowRectWidth(rcDialog),
WindowRectHeight(rcDialog) - cyDelta,
SWP_NOMOVE | SWP_NOZORDER);
}
return S_OK;
}
//+--------------------------------------------------------------------------
//
// Member: CMessageDlg::_OnCommand
//
// Synopsis: Handle user input.
//
// Arguments: standard windows
//
// Returns: standard windows
//
// History: 06-28-1998 DavidMun Created
//
//---------------------------------------------------------------------------
bool
CMessageDlg::_OnCommand(
WPARAM wParam,
LPARAM lParam)
{
bool fNotHandled = false;
switch (LOWORD(wParam))
{
case IDCANCEL:
EndDialog(m_hwnd, 0);
break;
default:
fNotHandled = true;
break;
}
return fNotHandled;
}
//+--------------------------------------------------------------------------
//
// Function: InvokeWinHelp
//
// Synopsis: Helper (ahem) function to invoke winhelp.
//
// Arguments: [message] - WM_CONTEXTMENU or WM_HELP
// [wParam] - depends on [message]
// [wszHelpFileName] - filename with or without path
// [aulControlIdToHelpIdMap] - see WinHelp API
//
// History: 06-10-1997 DavidMun Created
//
//---------------------------------------------------------------------------
void
InvokeWinHelp(
UINT message,
WPARAM wParam,
LPARAM lParam,
PCWSTR wszHelpFileName,
ULONG aulControlIdToHelpIdMap[])
{
switch (message)
{
case WM_CONTEXTMENU: // Right mouse click - "What's This" context menu
WinHelp((HWND) wParam,
wszHelpFileName,
HELP_CONTEXTMENU,
(DWORD_PTR) aulControlIdToHelpIdMap);
break;
case WM_HELP: // Help from the "?" dialog
{
const LPHELPINFO pHelpInfo = (LPHELPINFO) lParam;
if (pHelpInfo && pHelpInfo->iContextType == HELPINFO_WINDOW)
{
WinHelp((HWND) pHelpInfo->hItemHandle,
wszHelpFileName,
HELP_WM_HELP,
(DWORD_PTR) aulControlIdToHelpIdMap);
}
break;
}
default:
break;
}
}