417 lines
9 KiB
C++
417 lines
9 KiB
C++
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ListCtrl.cpp
|
|
|
|
Abstract:
|
|
|
|
Functions for "Welcome" and "Finish" pages of the wizard.
|
|
Author:
|
|
|
|
Sergey Kuzin (a-skuzin@microsoft.com) 09-August-1999
|
|
|
|
Environment:
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include "tsverui.h"
|
|
#include "resource.h"
|
|
|
|
|
|
void OnFinish(HWND hwndDlg, LPSHAREDWIZDATA pdata);
|
|
void ShowErrorBox(HWND hwndDlg, DWORD dwError);
|
|
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
dialog box procedure for the "Welcome" page.
|
|
|
|
Arguments :
|
|
|
|
IN HWND hwndDlg - handle to dialog box.
|
|
IN UINT uMsg - message to be acted upon.
|
|
IN WPARAM wParam - value specific to wMsg.
|
|
IN LPARAM lParam - value specific to wMsg.
|
|
|
|
Return Value :
|
|
|
|
TRUE if it processed the message
|
|
FALSE if it did not.
|
|
|
|
--*/
|
|
INT_PTR CALLBACK
|
|
StartPageProc (
|
|
HWND hwndDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
//Process messages from the Welcome page
|
|
|
|
//Retrieve the shared user data from GWL_USERDATA
|
|
|
|
LPSHAREDWIZDATA pdata = (LPSHAREDWIZDATA) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG :
|
|
{
|
|
//Get the shared data from PROPSHEETPAGE lParam value
|
|
//and load it into GWL_USERDATA
|
|
|
|
pdata = (LPSHAREDWIZDATA) ((LPPROPSHEETPAGE) lParam) -> lParam;
|
|
|
|
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR) pdata);
|
|
|
|
//It's an intro/end page, so get the title font
|
|
//from the shared data and use it for the title control
|
|
|
|
HWND hwndControl = GetDlgItem(hwndDlg, IDC_TITLE);
|
|
SetWindowFont(hwndControl,pdata->hTitleFont, TRUE);
|
|
break;
|
|
}
|
|
|
|
|
|
case WM_NOTIFY :
|
|
{
|
|
LPNMHDR lpnm = (LPNMHDR) lParam;
|
|
|
|
switch (lpnm->code)
|
|
{
|
|
case PSN_SETACTIVE : //Enable the Next button
|
|
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
|
|
break;
|
|
|
|
case PSN_WIZNEXT :
|
|
//Handle a Next button click here
|
|
if(IsDlgButtonChecked(hwndDlg,IDC_NOWELLCOME)==BST_CHECKED){
|
|
pdata->bNoWellcome=TRUE;
|
|
}
|
|
|
|
break;
|
|
|
|
case PSN_RESET :
|
|
//Handle a Cancel button click, if necessary
|
|
break;
|
|
|
|
|
|
default :
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
dialog box procedure for the "Finish" page.
|
|
|
|
Arguments :
|
|
|
|
IN HWND hwndDlg - handle to dialog box.
|
|
IN UINT uMsg - message to be acted upon.
|
|
IN WPARAM wParam - value specific to wMsg.
|
|
IN LPARAM lParam - value specific to wMsg.
|
|
|
|
Return Value :
|
|
|
|
TRUE if it processed the message
|
|
FALSE if it did not.
|
|
|
|
--*/
|
|
INT_PTR CALLBACK FinishPageProc (
|
|
HWND hwndDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
|
|
//Process messages from the Completion page
|
|
|
|
//Retrieve the shared user data from GWL_USERDATA
|
|
|
|
LPSHAREDWIZDATA pdata = (LPSHAREDWIZDATA) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG :
|
|
{
|
|
//Get the shared data from PROPSHEETPAGE lParam value
|
|
//and load it into GWL_USERDATA
|
|
|
|
pdata = (LPSHAREDWIZDATA) ((LPPROPSHEETPAGE) lParam) -> lParam;
|
|
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR) pdata);
|
|
|
|
//It's an intro/end page, so get the title font
|
|
//from userdata and use it on the title control
|
|
|
|
HWND hwndControl = GetDlgItem(hwndDlg, IDC_TITLE);
|
|
SetWindowFont(hwndControl,pdata->hTitleFont, TRUE);
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY :
|
|
{
|
|
LPNMHDR lpnm = (LPNMHDR) lParam;
|
|
|
|
switch (lpnm->code)
|
|
{
|
|
case PSN_SETACTIVE : //Enable the correct buttons on for the active page
|
|
|
|
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH);
|
|
break;
|
|
|
|
case PSN_WIZBACK :
|
|
|
|
//If the checkbox was checked, jump back
|
|
//to the first interior page, not the second
|
|
|
|
if(!pdata->bCheckingEnabled)
|
|
{
|
|
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, IDD_VERSION_CHECKING);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZFINISH :
|
|
//Handle a Finish button click, if necessary
|
|
OnFinish(hwndDlg,pdata);
|
|
break;
|
|
|
|
case PSN_RESET :
|
|
//Handle a Cancel button click, if necessary
|
|
break;
|
|
|
|
default :
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
writes all data into the registry.
|
|
|
|
Arguments :
|
|
IN HWND hwndDlg - handle to dialog box.
|
|
IN LPSHAREDWIZDATA pdata - pointer to the data struct.
|
|
|
|
Return Value :
|
|
|
|
none
|
|
|
|
--*/
|
|
void
|
|
OnFinish(
|
|
HWND hwndDlg,
|
|
LPSHAREDWIZDATA pdata)
|
|
{
|
|
LONG lResult;
|
|
//
|
|
if(pdata->bNoWellcome){
|
|
lResult=SetRegKey(HKEY_USERS, szConstraintsKeyPath,
|
|
KeyName[NOWELLCOME], 1);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
}
|
|
//
|
|
if (pdata->bCheckingEnabled){
|
|
|
|
lResult=SetRegKey(HKEY_LOCAL_MACHINE, szKeyPath,
|
|
KeyName[ASYNCHRONOUS], 0);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
lResult=SetRegKey(HKEY_LOCAL_MACHINE, szKeyPath,
|
|
KeyName[IMPERSONATE], 0);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
lResult=SetRegKeyString(HKEY_LOCAL_MACHINE,
|
|
TEXT("tsver.dll"),szKeyPath, KeyName[DLLNAME]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
lResult=SetRegKeyString(HKEY_LOCAL_MACHINE,
|
|
TEXT("TsVerEventStartup"), szKeyPath, KeyName[STARTUP]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
|
|
} else { // delete all the keys
|
|
for (int i = 0; i < 4; i++){
|
|
lResult=DeleteRegKey(HKEY_LOCAL_MACHINE, szKeyPath, KeyName[i]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
}
|
|
//do not save other members, they are not valid!
|
|
return;
|
|
}
|
|
|
|
//write message
|
|
if (pdata->bMessageEnabled)
|
|
{
|
|
lResult=SetRegKey(HKEY_USERS, szConstraintsKeyPath, KeyName[USE_MSG], 1);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
} else {
|
|
lResult=DeleteRegKey(HKEY_USERS, szConstraintsKeyPath, KeyName[USE_MSG]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// write constraints string
|
|
if (pdata->pszConstraints&&_tcslen(pdata->pszConstraints)){
|
|
|
|
lResult=SetRegKeyString(HKEY_USERS, pdata->pszConstraints,
|
|
szConstraintsKeyPath,
|
|
KeyName[CONSTRAINTS]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
} else {
|
|
lResult=DeleteRegKey(HKEY_USERS,
|
|
szConstraintsKeyPath,
|
|
KeyName[CONSTRAINTS]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// write title string
|
|
if (pdata->pszMessageTitle&&_tcslen(pdata->pszMessageTitle)){
|
|
|
|
lResult=SetRegKeyString(HKEY_USERS, pdata->pszMessageTitle,
|
|
szConstraintsKeyPath,
|
|
KeyName[MSG_TITLE]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
} else {
|
|
lResult=DeleteRegKey(HKEY_USERS,
|
|
szConstraintsKeyPath,
|
|
KeyName[MSG_TITLE]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// write message string
|
|
if (pdata->pszMessageText&&_tcslen(pdata->pszMessageText)){
|
|
|
|
lResult=SetRegKeyString(HKEY_USERS, pdata->pszMessageText,
|
|
szConstraintsKeyPath,
|
|
KeyName[MSG]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
} else {
|
|
lResult=DeleteRegKey(HKEY_USERS,
|
|
szConstraintsKeyPath,
|
|
KeyName[MSG]);
|
|
if(lResult!=ERROR_SUCCESS){
|
|
ShowErrorBox(hwndDlg,lResult);
|
|
return;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
shows MessageBox with error message.
|
|
|
|
Arguments :
|
|
IN HWND hwndDlg - handle to dialog box.
|
|
IN DWORD dwError - error code.
|
|
|
|
Return Value :
|
|
|
|
none
|
|
|
|
--*/
|
|
void
|
|
ShowErrorBox(
|
|
HWND hwndDlg,
|
|
DWORD dwError)
|
|
{
|
|
|
|
LPTSTR MsgBuf=NULL;
|
|
|
|
DWORD dwFlags=FORMAT_MESSAGE_FROM_SYSTEM|
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER|
|
|
FORMAT_MESSAGE_IGNORE_INSERTS;
|
|
|
|
if(!FormatMessage(
|
|
dwFlags,
|
|
NULL, dwError,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
(LPTSTR)&MsgBuf, 0, NULL )){
|
|
|
|
MsgBuf=(LPTSTR)LocalAlloc(LPTR,2*sizeof(TCHAR));
|
|
if(MsgBuf == NULL) {
|
|
return;
|
|
}
|
|
|
|
MsgBuf[0]=' ';
|
|
}
|
|
|
|
TCHAR szTemplate[256];
|
|
LoadString(g_hInst,IDS_SAVE_ERROR,szTemplate,255);
|
|
LPTSTR szErrorMsg=new TCHAR[_tcslen(MsgBuf)+_tcslen(szTemplate)+1];
|
|
if(szErrorMsg == NULL) {
|
|
return;
|
|
}
|
|
wsprintf(szErrorMsg,szTemplate,MsgBuf);
|
|
MessageBox(hwndDlg,szErrorMsg,NULL,MB_OK|MB_ICONERROR);
|
|
delete szErrorMsg;
|
|
LocalFree(MsgBuf);
|
|
}
|
|
|