windows-nt/Source/XPSP1/NT/shell/ext/occache/property.cpp

746 lines
24 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "item.h"
#include "parseinf.h"
#include <mstask.h>
#include <iehelpid.h>
#include "parseinf.h"
#include <mluisupp.h>
#ifdef AUTO_UPDATE
#define NUM_PAGES 4
#else
#define NUM_PAGES 3
#endif
#define DEFAULT_LANG_CODEPAGE_PAIR 0x040904B0
#define MAX_QUERYPREFIX_LEN 512
#define MAX_QUERYSTRING_LEN 1024
// defined in utils.cpp
extern LPCTSTR g_lpszUpdateInfo;
extern LPCTSTR g_lpszCookieValue;
extern LPCTSTR g_lpszSavedValue;
///////////////////////////////////////////////////////////////////////////////
// functions that deal with web check
// define a macro to make life easier
#define QUIT_IF_FAIL if (FAILED(hr)) goto Exit
void DestroyDialogIcon(HWND hDlg)
{
HICON hIcon = (HICON)SendDlgItemMessage(
hDlg, IDC_STATIC_ICON,
STM_GETICON, 0, 0);
if (hIcon != NULL)
DestroyIcon(hIcon);
}
///////////////////////////////////////////////////////////////////////////////
// functions that deal with property page 1
void InitPropPage1(HWND hDlg, LPARAM lParam)
{
BOOL bHasActiveX;
BOOL bHasJava;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)((LPPROPSHEETPAGE)lParam)->lParam;
if (pcpidl)
{
// draw control icon
{
HICON hIcon = ExtractIcon(g_hInst, GetStringInfo(pcpidl, SI_LOCATION), 0);
if (hIcon == NULL)
hIcon = GetDefaultOCIcon( pcpidl );
Assert(hIcon != NULL);
SendDlgItemMessage(hDlg, IDC_STATIC_ICON, STM_SETICON, (WPARAM)hIcon, 0);
}
SetDlgItemText(hDlg, IDC_STATIC_CONTROL, GetStringInfo(pcpidl, SI_CONTROL));
SetDlgItemText(hDlg, IDC_STATIC_CREATION, GetStringInfo(pcpidl, SI_CREATION));
SetDlgItemText(hDlg, IDC_STATIC_LASTACCESS, GetStringInfo(pcpidl, SI_LASTACCESS));
SetDlgItemText(hDlg, IDC_STATIC_CLSID, GetStringInfo(pcpidl, SI_CLSID));
SetDlgItemText(hDlg, IDC_STATIC_CODEBASE, GetStringInfo(pcpidl, SI_CODEBASE));
TCHAR szBuf[MESSAGE_MAXSIZE];
GetContentBools( pcpidl, &bHasActiveX, &bHasJava );
if ( bHasJava )
{
if ( bHasActiveX )
MLLoadString(IDS_PROPERTY_TYPE_MIXED, szBuf, MESSAGE_MAXSIZE);
else
MLLoadString(IDS_PROPERTY_TYPE_JAVA, szBuf, MESSAGE_MAXSIZE);
}
else
MLLoadString(IDS_PROPERTY_TYPE_ACTX, szBuf, MESSAGE_MAXSIZE);
SetDlgItemText(hDlg, IDC_STATIC_TYPE, szBuf);
GetStatus(pcpidl, szBuf, MESSAGE_MAXSIZE);
SetDlgItemText(hDlg, IDC_STATIC_STATUS, szBuf);
DWORD dwSizeSaved = GetSizeSaved(pcpidl);
TCHAR szSize[20];
wsprintf(szSize, "%u", dwSizeSaved);
// insert commas to separate groups of digits
int nLen = lstrlen(szSize);
int i = 0, j = (nLen <= 3 ? nLen : (nLen % 3));
TCHAR *pCh = szSize + j;
for (; i < j; i++)
szBuf[i] = szSize[i];
for (; *pCh != '\0'; i++, pCh++)
{
if (((pCh - szSize) % 3 == j) && (i > 0))
szBuf[i++] = ',';
szBuf[i] = *pCh;
}
szBuf[i] = '\0';
TCHAR szBytes[BYTES_MAXSIZE];
MLLoadString(IDS_PROPERTY_BYTES, szBytes, BYTES_MAXSIZE);
lstrcat(szBuf, TEXT(" "));
lstrcat(szBuf, szBytes);
lstrcat(szBuf, TEXT(" ("));
GetSizeSaved(pcpidl, szBuf + lstrlen(szBuf));
lstrcat(szBuf, TEXT(")"));
SetDlgItemText(hDlg, IDC_STATIC_TOTALSIZE, szBuf);
}
}
// Dialog proc for page 1
INT_PTR CALLBACK ControlItem_PropPage1Proc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE) GetWindowLongPtr(hDlg, DWLP_USER);
LPCONTROLPIDL pcpidl = lpPropSheet ? (LPCONTROLPIDL)lpPropSheet->lParam : NULL;
const static DWORD aIds[] = {
IDC_STATIC_LABEL_TYPE, IDH_DLOAD_TYPE,
IDC_STATIC_LABEL_CREATION, IDH_DLOAD_CREATED,
IDC_STATIC_LABEL_LASTACCESS, IDH_DLOAD_LASTACC,
IDC_STATIC_LABEL_TOTALSIZE, IDH_DLOAD_TOTALSIZE,
IDC_STATIC_LABEL_CLSID, IDH_DLOAD_ID,
IDC_STATIC_LABEL_STATUS, IDH_DLOAD_STATUS,
IDC_STATIC_LABEL_CODEBASE, IDH_DLOAD_CODEBASE,
IDC_STATIC_TYPE, IDH_DLOAD_TYPE,
IDC_STATIC_CREATION, IDH_DLOAD_CREATED,
IDC_STATIC_LASTACCESS, IDH_DLOAD_LASTACC,
IDC_STATIC_TOTALSIZE, IDH_DLOAD_TOTALSIZE,
IDC_STATIC_CLSID, IDH_DLOAD_ID,
IDC_STATIC_STATUS, IDH_DLOAD_STATUS,
IDC_STATIC_CODEBASE, IDH_DLOAD_CODEBASE,
IDC_STATIC_CONTROL, IDH_DLOAD_OBJNAME,
0, 0
};
switch(message)
{
case WM_HELP:
SHWinHelpOnDemandWrap((HWND)(((LPHELPINFO)lParam)->hItemHandle), "iexplore.hlp", HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds);
break;
case WM_CONTEXTMENU:
SHWinHelpOnDemandWrap((HWND)wParam, "iexplore.hlp", HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds);
break;
case WM_INITDIALOG:
InitPropPage1(hDlg, lParam);
break;
case WM_DESTROY:
DestroyDialogIcon(hDlg);
break;
case WM_COMMAND:
// user can't change anything, so we don't care about any messages
break;
default:
return FALSE;
} // end of switch
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// functions that deal with property page 2
int ListCtrl_InsertColumn(
HWND hwnd,
int nCol,
LPCTSTR lpszColumnHeading,
int nFormat,
int nWidth,
int nSubItem)
{
LV_COLUMN column;
column.mask = LVCF_TEXT|LVCF_FMT;
column.pszText = (LPTSTR)lpszColumnHeading;
column.fmt = nFormat;
if (nWidth != -1)
{
column.mask |= LVCF_WIDTH;
column.cx = nWidth;
}
if (nSubItem != -1)
{
column.mask |= LVCF_SUBITEM;
column.iSubItem = nSubItem;
}
return (int)::SendMessage(hwnd, LVM_INSERTCOLUMN, nCol, (LPARAM)&column);
}
BOOL ListCtrl_SetItemText(
HWND hwnd,
int nItem,
int nSubItem,
LPCTSTR lpszItem)
{
LV_ITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iItem = nItem;
lvi.iSubItem = nSubItem;
lvi.stateMask = 0;
lvi.state = 0;
lvi.pszText = (LPTSTR) lpszItem;
lvi.iImage = 0;
lvi.lParam = 0;
return (BOOL)::SendMessage(hwnd, LVM_SETITEM, 0, (LPARAM)&lvi);
}
int ListCtrl_InsertItem(
HWND hwnd,
UINT nMask,
int nItem,
LPCTSTR lpszItem,
UINT nState,
UINT nStateMask,
int nImage,
LPARAM lParam)
{
LV_ITEM item;
item.mask = nMask;
item.iItem = nItem;
item.iSubItem = 0;
item.pszText = (LPTSTR)lpszItem;
item.state = nState;
item.stateMask = nStateMask;
item.iImage = nImage;
item.lParam = lParam;
return (int)::SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM)&item);
}
void InitPropPage2(HWND hDlg, LPARAM lParam)
{
int iFileNameWidth = 0;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)((LPPROPSHEETPAGE)lParam)->lParam;
UINT cTotalFiles = GetTotalNumOfFiles(pcpidl);
{
HICON hIcon = ExtractIcon(g_hInst, GetStringInfo(pcpidl, SI_LOCATION), 0);
if (hIcon == NULL)
hIcon = GetDefaultOCIcon( pcpidl );
Assert(hIcon != NULL);
SendDlgItemMessage(hDlg, IDC_STATIC_ICON, STM_SETICON, (WPARAM)hIcon, 0);
}
// insert columns into file list box
RECT rect;
int nWidth;
TCHAR szBuf[MAX_PATH];
HWND hwndCtrl = GetDlgItem(hDlg, IDC_DEPENDENCYLIST);
Assert(::IsWindow(hwndCtrl));
GetClientRect(hwndCtrl, &rect);
nWidth = rect.right - rect.left;
MLLoadString(IDS_LISTTITLE_FILENAME, szBuf, MAX_PATH);
iFileNameWidth = nWidth * 7 / 10;
ListCtrl_InsertColumn(
hwndCtrl,
0,
szBuf,
LVCFMT_LEFT,
iFileNameWidth, 0);
MLLoadString(IDS_LISTTITLE_FILESIZE, szBuf, MAX_PATH);
ListCtrl_InsertColumn(
hwndCtrl,
1,
szBuf,
LVCFMT_LEFT,
nWidth * 3 / 10,
0);
// insert dependent files into list box
int iIndex = -1;
LONG lResult = ERROR_SUCCESS;
DWORD dwFileSize = 0;
BOOL bOCXRemovable = IsModuleRemovable(GetStringInfo(pcpidl, SI_LOCATION));
for (UINT iFile = 0; iFile < cTotalFiles; iFile++)
{
if (!GetDependentFile(pcpidl, iFile, szBuf, &dwFileSize))
{
Assert(FALSE);
break;
}
// put a star after file name if file is not safe for removal
if (!bOCXRemovable)
{
lstrcat(szBuf, TEXT("*"));
}
else if (!IsModuleRemovable(szBuf))
{
// check if it is inf file.
TCHAR szExt[10];
MLLoadString(IDS_EXTENSION_INF, szExt, 10);
int nLen = lstrlen(szBuf);
int nLenExt = lstrlen(szExt);
if ((nLen > nLenExt) &&
(lstrcmpi(szBuf+(nLen-nLenExt), szExt) != 0))
lstrcat(szBuf, TEXT("*"));
}
PathCompactPath(NULL, szBuf, iFileNameWidth);
iIndex = ListCtrl_InsertItem(hwndCtrl, LVIF_TEXT, iFile, szBuf, 0, 0, 0, 0);
if (dwFileSize > 0)
{
TCHAR szBuf2[100];
wsprintf(szBuf2, "%u", dwFileSize);
// insert commas to separate groups of digits
int nLen = lstrlen(szBuf2);
int i = 0, j = (nLen <= 3 ? nLen : (nLen % 3));
TCHAR *pCh = szBuf2 + j;
for (; i < j; i++)
szBuf[i] = szBuf2[i];
for (; *pCh != '\0'; i++, pCh++)
{
if (((pCh - szBuf2) % 3 == j) && (i > 0))
szBuf[i++] = ',';
szBuf[i] = *pCh;
}
szBuf[i] = '\0';
}
else
MLLoadString(IDS_STATUS_DAMAGED, szBuf, MAX_PATH);
ListCtrl_SetItemText(hwndCtrl, iIndex, 1, szBuf);
}
// insert columns into file list box
hwndCtrl = GetDlgItem(hDlg, IDC_PACKAGELIST);
Assert(::IsWindow(hwndCtrl));
GetClientRect(hwndCtrl, &rect);
nWidth = (rect.right - rect.left) / 2;
MLLoadString(IDS_LISTTITLE_PACKAGENAME, szBuf, MAX_PATH);
ListCtrl_InsertColumn(
hwndCtrl,
0,
szBuf,
LVCFMT_LEFT,
nWidth, 0);
MLLoadString(IDS_LISTTITLE_NAMESPACE, szBuf, MAX_PATH);
ListCtrl_InsertColumn(
hwndCtrl,
1,
szBuf,
LVCFMT_LEFT,
nWidth, 0);
// insert dependent packages into list box
UINT cTotalPackages = 0;;
if ( pcpidl->ci.dwIsDistUnit )
{
CParseInf parseInf;
if ( SUCCEEDED(parseInf.DoParseDU( GetStringInfo( pcpidl, SI_LOCATION), GetStringInfo( pcpidl,SI_CLSID ))) )
{
CPackageNode *ppn;
for ( ppn = parseInf.GetFirstPackage();
ppn != NULL;
ppn = parseInf.GetNextPackage(), cTotalPackages++ )
{
iIndex = ListCtrl_InsertItem(hwndCtrl, LVIF_TEXT, cTotalPackages, ppn->GetName(), 0, 0, 0, 0);
ListCtrl_SetItemText(hwndCtrl, iIndex, 1, ppn->GetNamespace());
}
}
}
// update description
{
TCHAR szMsg[MESSAGE_MAXSIZE];
TCHAR szBuf[MESSAGE_MAXSIZE];
// BUG: This is not the correct way to make va_list for Alpha
DWORD_PTR adwArgs[3];
adwArgs[0] = cTotalFiles;
adwArgs[1] = cTotalPackages;
adwArgs[2] = (DWORD_PTR) GetStringInfo(pcpidl, SI_CONTROL);
MLLoadString(IDS_MSG_DEPENDENCY, szBuf, MESSAGE_MAXSIZE);
FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
szBuf, 0, 0, szMsg, MESSAGE_MAXSIZE, (va_list*)adwArgs );
SetDlgItemText(hDlg, IDC_STATIC_DESCRIPTION, szMsg);
}
}
// Dialog proc for page 2
INT_PTR CALLBACK ControlItem_PropPage2Proc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE) GetWindowLongPtr(hDlg, DWLP_USER);
LPCONTROLPIDL pcpidl = lpPropSheet ? (LPCONTROLPIDL)lpPropSheet->lParam : NULL;
const static DWORD aIds[] = {
IDC_DEPENDENCYLIST, IDH_DLOAD_FILE_DEP,
IDC_PACKAGELIST, IDH_DLOAD_JAVAPKG_DEP,
0, 0
};
switch(message)
{
case WM_HELP:
SHWinHelpOnDemandWrap((HWND)(((LPHELPINFO)lParam)->hItemHandle), "iexplore.hlp", HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds);
break;
case WM_CONTEXTMENU:
SHWinHelpOnDemandWrap((HWND)wParam, "iexplore.hlp", HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds);
break;
case WM_INITDIALOG:
InitPropPage2(hDlg, lParam);
break;
case WM_DESTROY:
DestroyDialogIcon(hDlg);
break;
case WM_COMMAND:
break;
default:
return FALSE;
} // end of switch
return TRUE;
}
#if 0
// Do UI update
BOOL Page3_OnCommand(HWND hDlg, WORD wCmd)
{
HWND hwnd = GetDlgItem(hDlg, IDC_CHECK_NEVERUPDATE);
Assert(hwnd != NULL);
// if top check box is checked, disable the edit box
BOOL bEnable = ((int)::SendMessage(hwnd, BM_GETCHECK, 0, 0) != 1);
hwnd = GetDlgItem(hDlg, IDC_EDIT_UPDATEINTERVAL);
Assert(hwnd != NULL);
EnableWindow(hwnd, bEnable);
// if top check box is not checked and edit box does not
// have the focus and it is empty, put in default interval
if (bEnable && (GetFocus() != hwnd))
{
TCHAR szText[10];
if (GetWindowText(hwnd, szText, 10) == 0)
{
// wsprintf(szText, "%i", g_dwDefaultInterval);
SetWindowText(hwnd, szText);
}
}
return TRUE;
}
#endif
///////////////////////////////////////////////////////////////////////////////
// functions that deal with property page 4
void InitPropPage4(HWND hDlg, LPARAM lParam)
{
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)((LPPROPSHEETPAGE)lParam)->lParam;
LPTSTR lpszFileName = (LPTSTR)GetStringInfo(pcpidl, SI_LOCATION);
TCHAR szBuf[MESSAGE_MAXSIZE];
DWORD dwHandle = 0, dwSizeVer = 0;
LPTSTR lpBuffer = NULL;
UINT uSize = 0;
LPVOID lpVerData = NULL;
UINT uLen = 0;
DWORD dwLangCodePage = 0;
char szQueryPrefix[MAX_QUERYPREFIX_LEN];
char szQueryString[MAX_QUERYSTRING_LEN];
// draw control icon
{
LPCTSTR pszIcon = GetStringInfo(pcpidl, SI_LOCATION);
HICON hIcon = NULL;
if (!pszIcon || !(hIcon = ExtractIcon(g_hInst, pszIcon, 0)))
{
hIcon = GetDefaultOCIcon( pcpidl );
}
Assert(hIcon != NULL);
SendDlgItemMessage(hDlg, IDC_STATIC_ICON, STM_SETICON, (WPARAM)hIcon, 0);
}
// set page header
if (MLLoadString(IDS_VERSION_PAGE_HEADER, szBuf, MESSAGE_MAXSIZE))
{
TCHAR szHeading[MESSAGE_MAXSIZE];
LPCTSTR pszControl = GetStringInfo(pcpidl, SI_CONTROL);
if (pszControl)
{
wsprintf(szHeading, szBuf, pszControl);
SetDlgItemText(hDlg, IDC_STATIC_VER_HEADING, szHeading);
}
}
// set Version field
LPCTSTR pszVersion = GetStringInfo(pcpidl, SI_VERSION);
if (!pszVersion)
return;
SetDlgItemText(hDlg, IDC_STATIC_VER_VERSION, pszVersion);
if (!lpszFileName)
return;
dwSizeVer = GetFileVersionInfoSize(lpszFileName, &dwHandle);
if (dwSizeVer <= 0)
return;
BYTE *pbData = new BYTE[dwSizeVer];
if (pbData == NULL)
return;
if (GetFileVersionInfo(lpszFileName, 0, dwSizeVer, pbData))
{
// Get correct codepage information
if (!VerQueryValue(pbData, "\\VarFileInfo\\Translation", &lpVerData, &uLen))
{
wsprintf(szQueryPrefix, "\\StringFileInfo\\%x\\CompanyName", DEFAULT_LANG_CODEPAGE_PAIR);
}
else
{
char szLangCodePad[9];
char szVBufPad[5], szVBuf[5]; // To fit a DWORD (padded)
ASSERT(lpVerData);
wnsprintf(szVBuf, ARRAYSIZE(szVBuf), "%x", LOWORD(*((DWORD *)lpVerData)));
// Pad the low word to 4 digits
lstrcpyn(szVBufPad, "0000", ARRAYSIZE(szVBufPad));
char *pszTmp = szVBufPad + (4 - lstrlen(szVBuf));
ASSERT(pszTmp > szVBufPad);
lstrcpy(pszTmp, szVBuf);
lstrcpyn(szLangCodePad, szVBufPad, ARRAYSIZE(szLangCodePad));
// Pad the high word to 4 digits
wnsprintf(szVBuf, ARRAYSIZE(szVBuf), "%x", HIWORD(*((DWORD *)lpVerData)));
lstrcpy(szVBufPad, "0000");
pszTmp = szVBufPad + (4 - lstrlen(szVBuf));
ASSERT(pszTmp > szVBufPad);
lstrcpy(pszTmp, szVBuf);
// Concatenate to get a codepage/lang-id string
lstrcatn(szLangCodePad, szVBufPad, ARRAYSIZE(szLangCodePad));
lstrcpy(szQueryPrefix, "\\StringFileInfo\\");
lstrcat(szQueryPrefix, szLangCodePad);
}
// set Company field
wnsprintf(szQueryString, ARRAYSIZE(szQueryString), "%s\\CompanyName", szQueryPrefix);
if (VerQueryValue(pbData, szQueryString, (void **)&lpBuffer, &uSize))
SetDlgItemText(hDlg, IDC_STATIC_VER_COMPANY, lpBuffer);
// set Description field
wnsprintf(szQueryString, ARRAYSIZE(szQueryString), "%s\\FileDescription", szQueryPrefix);
if (VerQueryValue(pbData, szQueryString, (void **)&lpBuffer, &uSize))
SetDlgItemText(hDlg, IDC_STATIC_VER_DESCRIPTION, lpBuffer);
// set CopyRight field
wnsprintf(szQueryString, ARRAYSIZE(szQueryString), "%s\\LegalCopyright", szQueryPrefix);
if (VerQueryValue(pbData, szQueryString, (void **)&lpBuffer, &uSize))
SetDlgItemText(hDlg, IDC_STATIC_VER_COPYRIGHT, lpBuffer);
// set Language field
if (VerQueryValue(pbData, TEXT("\\VarFileInfo\\Translation"), (void **)&lpBuffer, &uSize))
{
LPWORD lpLangId = (LPWORD)lpBuffer;
VerLanguageName(*lpLangId, szBuf, MESSAGE_MAXSIZE);
SetDlgItemText(hDlg, IDC_STATIC_VER_LANGUAGE, szBuf);
}
}
delete [] pbData;
}
// Dialog proc for page 4
INT_PTR CALLBACK ControlItem_PropPage4Proc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE) GetWindowLongPtr(hDlg, DWLP_USER);
LPCONTROLPIDL pcpidl = lpPropSheet ? (LPCONTROLPIDL)lpPropSheet->lParam : NULL;
const static DWORD aIds[] = {
IDC_STATIC_VER_LABEL_VERSION, IDH_DLOAD_VERSION,
IDC_STATIC_VER_LABEL_DESCRIPTION, IDH_DLOAD_DESC,
IDC_STATIC_VER_LABEL_COMPANY, IDH_DLOAD_COMPANY,
IDC_STATIC_VER_LABEL_LANGUAGE, IDH_DLOAD_LANG,
IDC_STATIC_VER_LABEL_COPYRIGHT, IDH_DLOAD_COPYRIGHT,
IDC_STATIC_VER_VERSION, IDH_DLOAD_VERSION,
IDC_STATIC_VER_DESCRIPTION, IDH_DLOAD_DESC,
IDC_STATIC_VER_COMPANY, IDH_DLOAD_COMPANY,
IDC_STATIC_VER_LANGUAGE, IDH_DLOAD_LANG,
IDC_STATIC_VER_COPYRIGHT, IDH_DLOAD_COPYRIGHT,
IDC_STATIC_CONTROL, IDH_DLOAD_OBJNAME,
0, 0
};
switch(message)
{
case WM_HELP:
SHWinHelpOnDemandWrap((HWND)(((LPHELPINFO)lParam)->hItemHandle), "iexplore.hlp", HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds);
break;
case WM_CONTEXTMENU:
SHWinHelpOnDemandWrap((HWND)wParam, "iexplore.hlp", HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds);
break;
case WM_INITDIALOG:
InitPropPage4(hDlg, lParam);
break;
case WM_DESTROY:
DestroyDialogIcon(hDlg);
break;
case WM_COMMAND:
// user can't change anything, so we don't care about any messages
break;
default:
return FALSE;
} // end of switch
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// functions that deal with property dialog
HRESULT CreatePropDialog(HWND hwnd, LPCONTROLPIDL pcpidl)
{
#ifdef AUTO_UPDATE
PROPSHEETPAGE psp[NUM_PAGES] = {{0},{0},{0},{0}};
#else
PROPSHEETPAGE psp[NUM_PAGES] = {{0},{0},{0}};
#endif
PROPSHEETHEADER psh = {0};
// initialize propsheet page 1.
psp[0].dwSize = sizeof(PROPSHEETPAGE);
psp[0].dwFlags = 0;
psp[0].hInstance = MLGetHinst();
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_PROP_GENERAL);
psp[0].pszIcon = NULL;
psp[0].pfnDlgProc = ControlItem_PropPage1Proc;
psp[0].pszTitle = NULL;
psp[0].lParam = (LPARAM)pcpidl; // send it the cache entry struct
// initialize propsheet page 2.
psp[1].dwSize = sizeof(PROPSHEETPAGE);
psp[1].dwFlags = 0;
psp[1].hInstance = MLGetHinst();
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_PROP_DEPENDENCY);
psp[1].pszIcon = NULL;
psp[1].pfnDlgProc = ControlItem_PropPage2Proc;
psp[1].pszTitle = NULL;
psp[1].lParam = (LPARAM)pcpidl; // send it the cache entry struct
#ifdef AUTO_UPDATE
// initialize propsheet page 3.
psp[2].dwSize = sizeof(PROPSHEETPAGE);
psp[2].dwFlags = 0;
psp[2].hInstance = MLGetHinst();
psp[2].pszTemplate = MAKEINTRESOURCE(IDD_PROP_UPDATE);
psp[2].pszIcon = NULL;
psp[2].pfnDlgProc = ControlItem_PropPage3Proc;
psp[2].pszTitle = NULL;
psp[2].lParam = (LPARAM)pcpidl; // send it the cache entry struct
#endif
// initialize propsheet page 4.
psp[NUM_PAGES-1].dwSize = sizeof(PROPSHEETPAGE);
psp[NUM_PAGES-1].dwFlags = 0;
psp[NUM_PAGES-1].hInstance = MLGetHinst();
psp[NUM_PAGES-1].pszTemplate = MAKEINTRESOURCE(IDD_PROP_VERSION);
psp[NUM_PAGES-1].pszIcon = NULL;
psp[NUM_PAGES-1].pfnDlgProc = ControlItem_PropPage4Proc;
psp[NUM_PAGES-1].pszTitle = NULL;
psp[NUM_PAGES-1].lParam = (LPARAM)pcpidl; // send it the cache entry struct
// initialize propsheet header.
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW|PSH_PROPTITLE;
psh.hwndParent = hwnd;
psh.pszCaption = GetStringInfo(pcpidl, SI_CONTROL);
psh.nPages = NUM_PAGES;
psh.nStartPage = 0;
psh.ppsp = (LPCPROPSHEETPAGE)&psp;
// invoke the property sheet
PropertySheet(&psh);
return NOERROR;
}