236 lines
6.1 KiB
C++
236 lines
6.1 KiB
C++
//
|
|
// SHMessageBoxHelp implementation
|
|
//
|
|
// History
|
|
// 01/14/00 dsheldon created
|
|
//
|
|
|
|
#include "priv.h"
|
|
#include "ids.h"
|
|
#include <htmlhelp.h>
|
|
#include "apithk.h"
|
|
|
|
HRESULTHELPMAPPING g_prghhmShellDefault[] =
|
|
{
|
|
{HRESULT_FROM_WIN32(ERROR_NO_NETWORK), "tshoot00.chm>windefault", "w0networking.htm" },
|
|
};
|
|
|
|
class CHelpMessageBox
|
|
{
|
|
public:
|
|
CHelpMessageBox(HRESULTHELPMAPPING* prghhm, DWORD chhm);
|
|
int DoHelpMessageBox(HWND hwndParent, LPCWSTR pszText, LPCWSTR pszCaption, UINT uType, HRESULT hrErr);
|
|
|
|
private:
|
|
int DisplayMessageBox(HWND hwnd, LPCWSTR pszText, LPCWSTR pszCaption, UINT uType);
|
|
HRESULTHELPMAPPING* GetHResultHelpMapping(HRESULT hrErr, HRESULTHELPMAPPING* prghhm, DWORD chhm);
|
|
|
|
static INT_PTR CALLBACK StaticDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
// Data
|
|
HRESULTHELPMAPPING* _prghhm;
|
|
DWORD _chhm;
|
|
|
|
HRESULTHELPMAPPING* _phhmEntry;
|
|
|
|
LPCWSTR _pszText;
|
|
LPCWSTR _pszCaption;
|
|
UINT _uType;
|
|
};
|
|
|
|
|
|
CHelpMessageBox::CHelpMessageBox(HRESULTHELPMAPPING* prghhm, DWORD chhm)
|
|
{
|
|
// Initialize class members
|
|
_phhmEntry = NULL;
|
|
_prghhm = prghhm;
|
|
_chhm = chhm;
|
|
}
|
|
|
|
|
|
int CHelpMessageBox::DisplayMessageBox(HWND hwnd, LPCWSTR pszText, LPCWSTR pszCaption, UINT uType)
|
|
{
|
|
LPWSTR pszAllocString = NULL;
|
|
|
|
if (NULL != _phhmEntry)
|
|
{
|
|
uType |= MB_HELP;
|
|
|
|
// Need to add the "For more information, click help." string.
|
|
WCHAR szMoreInfo[256];
|
|
|
|
if (LoadStringW(HINST_THISDLL, IDS_CLICKHELPFORINFO, szMoreInfo, ARRAYSIZE(szMoreInfo)))
|
|
{
|
|
DWORD cchText = lstrlenW(pszText);
|
|
|
|
// The 3 here are for '\n', '\n', '\0'
|
|
DWORD cchBuffer = cchText + lstrlenW(szMoreInfo) + 3;
|
|
|
|
pszAllocString = (LPWSTR) LocalAlloc(0, cchBuffer * sizeof (WCHAR));
|
|
|
|
if (pszAllocString)
|
|
{
|
|
StrCpyW(pszAllocString, pszText);
|
|
StrCpyW(pszAllocString + cchText, L"\n\n");
|
|
StrCpyW(pszAllocString + cchText + 2, szMoreInfo);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// No help topic mapping for this error
|
|
TraceMsg(TF_WARNING, "No help topic mapping for this error. Removing help button.");
|
|
uType &= (~MB_HELP);
|
|
}
|
|
|
|
int iReturn = MessageBoxWrapW(hwnd, pszAllocString ? pszAllocString : pszText, pszCaption, uType);
|
|
|
|
if (pszAllocString)
|
|
{
|
|
LocalFree(pszAllocString);
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
HRESULTHELPMAPPING* CHelpMessageBox::GetHResultHelpMapping(HRESULT hrErr, HRESULTHELPMAPPING* prghhm, DWORD chhm)
|
|
{
|
|
HRESULTHELPMAPPING* phhm = NULL;
|
|
|
|
for (DWORD i = 0; i < chhm; i++)
|
|
{
|
|
if (prghhm[i].hr == hrErr)
|
|
{
|
|
phhm = &(prghhm[i]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return phhm;
|
|
}
|
|
|
|
CHelpMessageBox::DoHelpMessageBox(HWND hwndParent, LPCWSTR pszText, LPCWSTR pszCaption, UINT uType, HRESULT hrErr)
|
|
{
|
|
int iReturn = 0;
|
|
_pszText = pszText;
|
|
_pszCaption = pszCaption;
|
|
_uType = uType;
|
|
|
|
// Find the index of the help topic matching the hresult
|
|
// First search the mapping the user passed in, if present
|
|
if (NULL != _prghhm)
|
|
{
|
|
_phhmEntry = GetHResultHelpMapping(hrErr, _prghhm, _chhm);
|
|
}
|
|
|
|
// If we didn't find a mapping in the caller's list, search the shell's global list
|
|
if (NULL == _phhmEntry)
|
|
{
|
|
_phhmEntry = GetHResultHelpMapping(hrErr, g_prghhmShellDefault, ARRAYSIZE(g_prghhmShellDefault));
|
|
}
|
|
|
|
ULONG_PTR ul;
|
|
HANDLE h = XP_CreateAndActivateContext(&ul);
|
|
iReturn = (int) DialogBoxParam(HINST_THISDLL, MAKEINTRESOURCE(DLG_NULL), hwndParent, StaticDlgProc, (LPARAM) this);
|
|
XP_DeactivateAndDestroyContext(h, ul);
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
INT_PTR CHelpMessageBox::StaticDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CHelpMessageBox* pthis = NULL;
|
|
|
|
if (uMsg == WM_INITDIALOG)
|
|
{
|
|
pthis = (CHelpMessageBox*) lParam;
|
|
SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) pthis);
|
|
}
|
|
else
|
|
{
|
|
pthis = (CHelpMessageBox*) GetWindowLongPtr(hwnd, DWLP_USER);
|
|
}
|
|
|
|
if (NULL != pthis)
|
|
{
|
|
return pthis->DlgProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
INT_PTR CHelpMessageBox::DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
INT_PTR iReturn = FALSE;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Launch Messagebox
|
|
{
|
|
int i = DisplayMessageBox(hwnd, _pszText, _pszCaption, _uType);
|
|
|
|
EndDialog(hwnd, i);
|
|
}
|
|
|
|
iReturn = TRUE;
|
|
|
|
break;
|
|
case WM_HELP:
|
|
// Call the appropriate help topic
|
|
ASSERT(_phhmEntry != NULL);
|
|
|
|
HtmlHelpA(
|
|
hwnd,
|
|
_phhmEntry->szHelpFile,
|
|
HH_DISPLAY_TOPIC,
|
|
(DWORD_PTR) _phhmEntry->szHelpTopic);
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
STDAPI_(int) SHMessageBoxHelpA(HWND hwnd,
|
|
LPCSTR pszText,
|
|
LPCSTR pszCaption,
|
|
UINT uType,
|
|
HRESULT hrErr,
|
|
HRESULTHELPMAPPING* prghhm,
|
|
DWORD chhm)
|
|
{
|
|
WCHAR szTextW[1024];
|
|
WCHAR szCaptionW[256];
|
|
|
|
CHelpMessageBox parent(prghhm, chhm);
|
|
|
|
if (!SHAnsiToUnicode(pszText, szTextW, ARRAYSIZE(szTextW)))
|
|
{
|
|
*szTextW = 0;
|
|
}
|
|
|
|
if (!SHAnsiToUnicode(pszCaption, szCaptionW, ARRAYSIZE(szCaptionW)))
|
|
{
|
|
*szCaptionW = 0;
|
|
}
|
|
|
|
return parent.DoHelpMessageBox(hwnd, szTextW, szCaptionW, uType, hrErr);
|
|
}
|
|
|
|
STDAPI_(int) SHMessageBoxHelpW(HWND hwnd,
|
|
LPCWSTR pszText,
|
|
LPCWSTR pszCaption,
|
|
UINT uType,
|
|
HRESULT hrErr,
|
|
HRESULTHELPMAPPING* prghhm,
|
|
DWORD chhm)
|
|
{
|
|
CHelpMessageBox parent(prghhm, chhm);
|
|
return parent.DoHelpMessageBox(hwnd, pszText, pszCaption, uType, hrErr);
|
|
}
|
|
|