Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

936 lines
24 KiB

//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// proppgs.cpp
//
// IShellPropSheetExt for channel shortcuts.
//
// History:
//
// 6/12/97 edwardp Created.
//
// Note: The hotkey stuff is comment out, the shell/windows doesn't make it
// possible to persist hotkey settings across sessions and it isn't
// worth kicking off another thread at boot to enable this feature.
//
////////////////////////////////////////////////////////////////////////////////
//
// Includes
//
#include "stdinc.h"
#include "cdfidl.h"
#include "persist.h"
#include "cdfview.h"
#include "proppgs.h"
#include "xmlutil.h"
#include "dll.h"
#include "iconhand.h"
#include "resource.h"
#include "winineti.h"
#include <iehelpid.h>
#include <mluisupp.h>
#pragma warning(disable:4800)
//
// Constructor and destructor.
//
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CPropertyPages::CPropertyPages ***
//
// Constructor for CPropertyPages.
//
////////////////////////////////////////////////////////////////////////////////
CPropertyPages::CPropertyPages (
void
)
: m_cRef(1)
{
ASSERT(NULL == m_pSubscriptionMgr2);
ASSERT(NULL == m_pInitDataObject);
TraceMsg(TF_OBJECTS, "+ IShellPropSheetExt");
DllAddRef();
return;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CPropertyPages::~CPropertyPages ***
//
// Destructor.
//
////////////////////////////////////////////////////////////////////////////////
CPropertyPages::~CPropertyPages (
void
)
{
if (m_pSubscriptionMgr2)
m_pSubscriptionMgr2->Release();
if (m_pInitDataObject)
m_pInitDataObject->Release();
ASSERT(0 == m_cRef);
//
// Matching Release for the constructor Addref.
//
TraceMsg(TF_OBJECTS, "- IShellPropSheetExt");
DllRelease();
return;
}
//
// IUnknown methods.
//
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CPropertyPages::QueryInterface ***
//
// CPropertyPages QI.
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CPropertyPages::QueryInterface (
REFIID riid,
void **ppv
)
{
ASSERT(ppv);
HRESULT hr;
*ppv = NULL;
if (IID_IUnknown == riid || IID_IShellPropSheetExt == riid)
{
*ppv = (IShellPropSheetExt*)this;
}
else if (IID_IShellExtInit == riid)
{
*ppv = (IShellExtInit*)this;
}
if (*ppv)
{
((IUnknown*)*ppv)->AddRef();
hr = S_OK;
}
else
{
hr = E_NOINTERFACE;
}
ASSERT((SUCCEEDED(hr) && *ppv) || (FAILED(hr) && NULL == *ppv));
return hr;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CPropertyPages::AddRef ***
//
// CPropertyPages AddRef.
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG)
CPropertyPages::AddRef (
void
)
{
ASSERT(m_cRef != 0);
ASSERT(m_cRef < (ULONG)-1);
return ++m_cRef;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CPropertyPages::Release ***
//
// CContextMenu Release.
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG)
CPropertyPages::Release (
void
)
{
ASSERT (m_cRef != 0);
ULONG cRef = --m_cRef;
if (0 == cRef)
delete this;
return cRef;
}
//
// IShellPropSheetExt methods.
//
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** Name ***
//
//
// Description:
//
//
// Parameters:
//
//
// Return:
//
//
// Comments:
//
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CPropertyPages::AddPages(
LPFNADDPROPSHEETPAGE lpfnAddPage,
LPARAM lParam
)
{
HRESULT hr = S_OK;
PROPSHEETPAGE psp;
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_DEFAULT | PSP_USECALLBACK;
psp.hInstance = MLGetHinst();
psp.pszTemplate = MAKEINTRESOURCE(IDD_CHANNEL_PROP);
psp.hIcon = NULL;
psp.pszTitle = NULL;
psp.pfnDlgProc = PropSheetDlgProc;
psp.lParam = (LPARAM)(CPropertyPages *)this;
psp.pfnCallback = PropSheetCallback;
HPROPSHEETPAGE hpage = CreatePropertySheetPage(&psp);
if (hpage)
{
// Release() happens in PropSheetCallback.
AddRef();
// Assume the mess below doesn't work, we want the default page to be us.
hr = 1;
// HACKHACK: This code attempts to remove the Folder property pages such as
// General and Sharing (it will also whack any 3rd party pages which were
// unfortunate enough to have been loaded before use :)
PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam;
// First make sure we can safely access the memory as if it were a
// PROPSHEETHEADER structure.
if (!IsBadReadPtr(ppsh, PROPSHEETHEADER_V1_SIZE) &&
!IsBadWritePtr(ppsh, PROPSHEETHEADER_V1_SIZE))
{
// Now see if the module matches shell32
if (ppsh->hInstance == GetModuleHandle(TEXT("shell32.dll")))
{
// looks good so rip 'em out
for (UINT i = 0; i < ppsh->nPages; i++)
{
// At least be a good citizen and delete their pages so we
// don't leak
DestroyPropertySheetPage(ppsh->phpage[i]);
}
ppsh->nPages = 0;
// Now we shouldn't need to mess with the default page. If someone
// loads after us, we may not win.
hr = 0;
}
}
if (lpfnAddPage(hpage, lParam))
{
WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
SHTCharToUnicode(m_szURL, wszURL, ARRAYSIZE(wszURL));
if (SUCCEEDED(InitializeSubsMgr2()))
{
m_pSubscriptionMgr2->IsSubscribed(wszURL, &m_bStartSubscribed);
if (m_bStartSubscribed)
{
IShellPropSheetExt *pspse;
if (SUCCEEDED(m_pSubscriptionMgr2->QueryInterface(IID_IShellPropSheetExt,
(void **)&pspse)))
{
pspse->AddPages(lpfnAddPage, lParam);
pspse->Release();
}
}
}
}
else
{
DestroyPropertySheetPage(hpage);
hr = E_FAIL;
}
}
else
{
hr = E_OUTOFMEMORY;
}
return hr;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** Name ***
//
//
// Description:
//
//
// Parameters:
//
//
// Return:
//
//
// Comments:
//
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CPropertyPages::ReplacePage(
UINT uPageID,
LPFNADDPROPSHEETPAGE lpfnAddPage,
LPARAM lParam
)
{
return E_NOTIMPL;
}
//
// IShellExtInit methods.
//
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** Name ***
//
//
// Description:
//
//
// Parameters:
//
//
// Return:
//
//
// Comments:
//
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CPropertyPages::Initialize(
LPCITEMIDLIST pidl,
LPDATAOBJECT pIDataObject,
HKEY hkey
)
{
HRESULT hr;
STGMEDIUM stgmed;
FORMATETC fmtetc = {CF_HDROP, NULL, DVASPECT_CONTENT, -1,
TYMED_HGLOBAL};
if (m_pInitDataObject)
m_pInitDataObject->Release();
m_pInitDataObject = pIDataObject;
m_pInitDataObject->AddRef();
hr = pIDataObject->GetData(&fmtetc, &stgmed);
if (SUCCEEDED(hr))
{
if (DragQueryFile((HDROP)stgmed.hGlobal, 0, m_szPath,
ARRAYSIZE(m_szPath)))
{
TCHAR szDesktopINI[MAX_PATH];
PathCombine(szDesktopINI, m_szPath, c_szDesktopINI);
GetPrivateProfileString(c_szChannel, c_szCDFURL, TEXT(""), m_szURL,
ARRAYSIZE(m_szURL), szDesktopINI);
//m_wHotkey = GetPrivateProfileInt(c_szChannel, c_szHotkey, 0, szDesktopINI);
}
else
{
hr = E_FAIL;
}
ReleaseStgMedium(&stgmed);
}
return hr;
}
//
// Helper functions
//
HRESULT CPropertyPages::InitializeSubsMgr2()
{
HRESULT hr = E_FAIL;
#ifndef UNIX
if (NULL != m_pSubscriptionMgr2)
{
hr = S_OK;
}
else
{
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
DLL_ForcePreloadDlls(PRELOAD_WEBCHECK);
hr = CoCreateInstance(CLSID_SubscriptionMgr, NULL,
CLSCTX_INPROC_SERVER, IID_ISubscriptionMgr2,
(void**)&m_pSubscriptionMgr2);
if (SUCCEEDED(hr))
{
IShellExtInit* pIShellExtInit;
hr = m_pSubscriptionMgr2->QueryInterface(IID_IShellExtInit,
(void **)&pIShellExtInit);
if (SUCCEEDED(hr))
{
hr = pIShellExtInit->Initialize(NULL, m_pInitDataObject, NULL);
pIShellExtInit->Release();
}
}
}
CoUninitialize();
}
#endif /* !UNIX */
return hr;
}
void CPropertyPages::ShowOfflineSummary(HWND hdlg, BOOL bShow)
{
static const int offSumIDs[] =
{
IDC_SUMMARY,
IDC_LAST_SYNC_TEXT,
IDC_LAST_SYNC,
IDC_DOWNLOAD_SIZE_TEXT,
IDC_DOWNLOAD_SIZE,
IDC_DOWNLOAD_RESULT,
IDC_DOWNLOAD_RESULT_TEXT,
IDC_FREE_SPACE_TEXT
};
if (bShow)
{
TCHAR szLastSync[128];
TCHAR szDownloadSize[128];
TCHAR szDownloadResult[128];
WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
MLLoadString(IDS_VALUE_UNKNOWN, szLastSync, ARRAYSIZE(szLastSync));
StrCpyN(szDownloadSize, szLastSync, ARRAYSIZE(szDownloadSize));
StrCpyN(szDownloadResult, szLastSync, ARRAYSIZE(szDownloadResult));
SHTCharToUnicode(m_szURL, wszURL, ARRAYSIZE(wszURL));
ASSERT(NULL != m_pSubscriptionMgr2);
if (NULL != m_pSubscriptionMgr2)
{
ISubscriptionItem *psi;
if (SUCCEEDED(m_pSubscriptionMgr2->GetItemFromURL(wszURL, &psi)))
{
enum { spLastSync, spDownloadSize, spDownloadResult };
static const LPCWSTR pProps[] =
{
c_szPropCompletionTime,
c_szPropCrawlActualSize,
c_szPropStatusString
};
VARIANT vars[ARRAYSIZE(pProps)];
if (SUCCEEDED(psi->ReadProperties(ARRAYSIZE(pProps), pProps, vars)))
{
if (VT_DATE == vars[spLastSync].vt)
{
FILETIME ft, ft2;
DWORD dwFlags = FDTF_DEFAULT;
SYSTEMTIME st;
VariantTimeToSystemTime(vars[spLastSync].date, &st);
SystemTimeToFileTime(&st, &ft);
LocalFileTimeToFileTime(&ft, &ft2);
SHFormatDateTime(&ft2, &dwFlags, szLastSync, ARRAYSIZE(szLastSync));
}
if (VT_I4 == vars[spDownloadSize].vt)
{
StrFormatByteSize(vars[spDownloadSize].lVal * 1024,
szDownloadSize, ARRAYSIZE(szDownloadSize));
}
if (VT_BSTR == vars[spDownloadResult].vt)
{
#ifdef UNICODE
wnsprintf(szDownloadResult, ARRAYSIZE(szDownloadResult),
TEXT("%s"), vars[spDownloadResult].bstrVal);
#else
wnsprintf(szDownloadResult, ARRAYSIZE(szDownloadResult),
TEXT("%S"), vars[spDownloadResult].bstrVal);
#endif
}
for (int i = 0; i < ARRAYSIZE(pProps); i++)
{
VariantClear(&vars[i]);
}
}
psi->Release();
}
}
SetDlgItemText(hdlg, IDC_LAST_SYNC, szLastSync);
SetDlgItemText(hdlg, IDC_DOWNLOAD_SIZE, szDownloadSize);
SetDlgItemText(hdlg, IDC_DOWNLOAD_RESULT, szDownloadResult);
}
for (int i = 0; i < ARRAYSIZE(offSumIDs); i++)
{
ShowWindow(GetDlgItem(hdlg, offSumIDs[i]), bShow ? SW_SHOW : SW_HIDE);
}
}
BOOL CPropertyPages::OnInitDialog(HWND hdlg)
{
TCHAR szName[MAX_PATH];
HICON hicon = NULL;
HRESULT hr;
CIconHandler *pIconHandler = new CIconHandler;
if (pIconHandler)
{
if (SUCCEEDED(pIconHandler->Load(m_szPath, 0)))
{
TCHAR szIconFile[MAX_PATH];
int iIndex;
UINT wFlags;
if (SUCCEEDED(pIconHandler->GetIconLocation(0, szIconFile, ARRAYSIZE(szIconFile),
&iIndex, &wFlags)))
{
HICON hiconScrap = NULL;
hr = pIconHandler->Extract(szIconFile, iIndex, &hicon, &hiconScrap,
MAKELONG(GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CXSMICON)));
if (S_FALSE == hr)
{
// Do it ourselves
hicon = ExtractIcon(g_hinst, szIconFile, iIndex);
}
else if ((NULL != hiconScrap) && (hicon != hiconScrap))
{
// Otherwise cleanup unwanted little icon
DestroyIcon(hiconScrap);
}
}
}
pIconHandler->Release();
}
if (NULL == hicon)
{
hicon = LoadIcon(g_hinst, MAKEINTRESOURCE(IDI_CHANNEL));
}
BOOL bEnableMakeOffline = TRUE;
SendDlgItemMessage(hdlg, IDC_ICONEX2, STM_SETICON, (WPARAM)hicon, 0);
StrCpyN(szName, m_szPath, ARRAYSIZE(szName));
PathStripPath(szName);
SetDlgItemText(hdlg, IDC_NAME, szName);
SetDlgItemText(hdlg, IDC_URL, m_szURL);
TCHAR szVisits[256];
szVisits[0] = 0;
CCdfView* pCCdfView = new CCdfView;
if (pCCdfView)
{
hr = pCCdfView->Load(m_szURL, 0);
if (SUCCEEDED(hr))
{
IXMLDocument* pIXMLDocument;
hr = pCCdfView->ParseCdf(NULL, &pIXMLDocument, PARSE_LOCAL);
if (SUCCEEDED(hr))
{
IXMLElement* pIXMLElement;
LONG nIndex;
hr = XML_GetFirstChannelElement(pIXMLDocument,
&pIXMLElement, &nIndex);
if (SUCCEEDED(hr))
{
BSTR bstrURL = XML_GetAttribute(pIXMLElement, XML_HREF);
if (bstrURL && *bstrURL)
{
BYTE cei[MAX_CACHE_ENTRY_INFO_SIZE];
LPINTERNET_CACHE_ENTRY_INFO pcei = (LPINTERNET_CACHE_ENTRY_INFO)cei;
DWORD cbcei = MAX_CACHE_ENTRY_INFO_SIZE;
if (GetUrlCacheEntryInfoW(bstrURL, pcei, &cbcei))
{
wnsprintf(szVisits, ARRAYSIZE(szVisits), TEXT("%d"),
pcei->dwHitRate);
}
}
SysFreeString(bstrURL);
pIXMLElement->Release();
}
pIXMLDocument->Release();
}
}
pCCdfView->Release();
}
if (0 == szVisits[0])
{
MLLoadString(IDS_VALUE_UNKNOWN, szVisits,
ARRAYSIZE(szVisits));
}
SetDlgItemText(hdlg, IDC_VISITS, szVisits);
/*
SendDlgItemMessage(hdlg, IDC_HOTKEY, HKM_SETRULES,
(HKCOMB_NONE | HKCOMB_A | HKCOMB_C | HKCOMB_S),
(HOTKEYF_CONTROL | HOTKEYF_ALT));
SendDlgItemMessage(hdlg, IDC_HOTKEY, HKM_SETHOTKEY, m_wHotkey, 0);
*/
WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
SHTCharToUnicode(m_szURL, wszURL, ARRAYSIZE(wszURL));
CheckDlgButton(hdlg, IDC_MAKE_OFFLINE, m_bStartSubscribed ? 1 : 0);
if (m_bStartSubscribed)
{
if (SHRestricted2(REST_NoRemovingSubscriptions, m_szURL, 0))
{
bEnableMakeOffline = FALSE;
}
}
else
{
if (SHRestricted2(REST_NoAddingSubscriptions, m_szURL, 0))
{
bEnableMakeOffline = FALSE;
}
}
if (!CanSubscribe(wszURL))
{
bEnableMakeOffline = FALSE;
}
if (!bEnableMakeOffline)
{
EnableWindow(GetDlgItem(hdlg, IDC_MAKE_OFFLINE), FALSE);
}
ShowOfflineSummary(hdlg, m_bStartSubscribed);
return TRUE;
}
BOOL AddSubsPropsCallback(HPROPSHEETPAGE hpage, LPARAM lParam)
{
return (bool) PropSheet_AddPage((HWND)lParam, hpage);
}
void CPropertyPages::AddRemoveSubsPages(HWND hdlg, BOOL bAdd)
{
ASSERT(NULL != m_pSubscriptionMgr2);
if (NULL != m_pSubscriptionMgr2)
{
if (bAdd)
{
IShellPropSheetExt *pspse;
if (SUCCEEDED(m_pSubscriptionMgr2->QueryInterface(IID_IShellPropSheetExt,
(void **)&pspse)))
{
pspse->AddPages(AddSubsPropsCallback, (LPARAM)GetParent(hdlg));
pspse->Release();
}
}
else
{
ISubscriptionMgrPriv *psmp;
if (SUCCEEDED(m_pSubscriptionMgr2->QueryInterface(IID_ISubscriptionMgrPriv,
(void **)&psmp)))
{
psmp->RemovePages(GetParent(hdlg));
psmp->Release();
}
}
ShowOfflineSummary(hdlg, bAdd);
}
}
BOOL CPropertyPages::OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
{
BOOL bHandled = TRUE;
switch (wID)
{
case IDC_MAKE_OFFLINE:
if (wNotifyCode == BN_CLICKED)
{
AddRemoveSubsPages(hdlg, IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE));
PropSheet_Changed(GetParent(hdlg), hdlg);
}
break;
/*
case IDC_HOTKEY:
if (wNotifyCode == EN_CHANGE)
{
PropSheet_Changed(GetParent(hdlg), hdlg);
}
break;
*/
default:
bHandled = FALSE;
break;
}
return bHandled;
}
BOOL CPropertyPages::OnNotify(HWND hdlg, WPARAM idCtrl, LPNMHDR pnmh)
{
BOOL bHandled = FALSE;
switch (pnmh->code)
{
case PSN_APPLY:
{
/*
TCHAR szHotkey[32];
TCHAR szDesktopINI[MAX_PATH];
WORD wOldHotkey = m_wHotkey;
m_wHotkey = (WORD)SendDlgItemMessage(hdlg, IDC_HOTKEY, HKM_GETHOTKEY, 0, 0);
wnsprintf(szHotkey, ARRAYSIZE(szHotkey), TEXT("%d"), m_wHotkey);
PathCombine(szDesktopINI, m_szPath, c_szDesktopINI);
WritePrivateProfileString(c_szChannel, c_szHotkey, szHotkey, szDesktopINI);
RegisterGlobalHotkey(wOldHotkey, m_wHotkey, m_szPath);
*/
BOOL bIsSubscribed = IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE);
if (!bIsSubscribed)
{
WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
SHTCharToUnicode(m_szURL, wszURL, ARRAYSIZE(wszURL));
if (NULL != m_pSubscriptionMgr2)
{
m_pSubscriptionMgr2->DeleteSubscription(wszURL, NULL);
}
}
else
{
ISubscriptionMgrPriv *psmp;
if ((NULL != m_pSubscriptionMgr2) &&
SUCCEEDED(m_pSubscriptionMgr2->QueryInterface(IID_ISubscriptionMgrPriv,
(void **)&psmp)))
{
psmp->SaveSubscription();
psmp->Release();
}
}
bHandled = TRUE;
break;
}
}
return bHandled;
}
void CPropertyPages::OnDestroy(HWND hdlg)
{
if (!m_bStartSubscribed &&
IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE) &&
(NULL != m_pSubscriptionMgr2))
{
WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
SHTCharToUnicode(m_szURL, wszURL, ARRAYSIZE(wszURL));
m_pSubscriptionMgr2->UpdateSubscription(wszURL);
}
// Ensure sys bit is still set
SetFileAttributes(m_szPath, FILE_ATTRIBUTE_SYSTEM);
}
UINT CPropertyPages::PropSheetCallback(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp)
{
switch (uMsg)
{
case PSPCB_RELEASE:
if (NULL != ppsp->lParam)
{
((CPropertyPages *)ppsp->lParam)->Release();
}
break;
}
return 1;
}
TCHAR c_szHelpFile[] = TEXT("iexplore.hlp");
DWORD aHelpIDs[] = {
IDC_NAME, IDH_SUBPROPS_SUBTAB_SUBSCRIBED_NAME,
IDC_URL_TEXT, IDH_SUBPROPS_SUBTAB_SUBSCRIBED_URL,
IDC_URL, IDH_SUBPROPS_SUBTAB_SUBSCRIBED_URL,
// IDC_HOTKEY_TEXT, IDH_WEBDOC_HOTKEY,
// IDC_HOTKEY, IDH_WEBDOC_HOTKEY,
IDC_VISITS_TEXT, IDH_WEBDOC_VISITS,
IDC_VISITS, IDH_WEBDOC_VISITS,
IDC_MAKE_OFFLINE, IDH_MAKE_AVAIL_OFFLINE,
IDC_SUMMARY, IDH_GROUPBOX,
IDC_LAST_SYNC_TEXT, IDH_SUBPROPS_SUBTAB_LAST,
IDC_LAST_SYNC, IDH_SUBPROPS_SUBTAB_LAST,
IDC_DOWNLOAD_SIZE_TEXT, IDH_SUBPROPS_DLSIZE,
IDC_DOWNLOAD_SIZE, IDH_SUBPROPS_DLSIZE,
IDC_DOWNLOAD_RESULT_TEXT, IDH_SUBPROPS_SUBTAB_RESULT,
IDC_DOWNLOAD_RESULT, IDH_SUBPROPS_SUBTAB_RESULT,
0, 0
};
INT_PTR CPropertyPages::PropSheetDlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
INT_PTR lrHandled = FALSE;
CPropertyPages *pThis;
switch (msg)
{
case WM_INITDIALOG:
{
LPPROPSHEETPAGE pPropSheetPage = (LPPROPSHEETPAGE)lParam;
ASSERT(NULL != pPropSheetPage);
if (NULL != pPropSheetPage)
{
SetWindowLongPtr(hdlg, DWLP_USER, pPropSheetPage->lParam);
}
pThis = GetThis(hdlg);
if (NULL != pThis)
{
lrHandled = pThis->OnInitDialog(hdlg);
}
break;
}
case WM_COMMAND:
pThis = GetThis(hdlg);
if (NULL != pThis)
{
lrHandled = pThis->OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
}
break;
case WM_NOTIFY:
pThis = GetThis(hdlg);
if (NULL != pThis)
{
lrHandled = pThis->OnNotify(hdlg, wParam, (LPNMHDR)lParam);
}
break;
case WM_DESTROY:
pThis = GetThis(hdlg);
if (NULL != pThis)
{
pThis->OnDestroy(hdlg);
}
break;
case WM_HELP:
SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile,
HELP_WM_HELP, (DWORD_PTR) aHelpIDs);
lrHandled = TRUE;
break;
case WM_CONTEXTMENU:
SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs);
lrHandled = TRUE;
break;
}
return lrHandled;
}