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.
304 lines
8.5 KiB
304 lines
8.5 KiB
#include <shlobj.h>
|
|
#include <windowsx.h>
|
|
#include <shellapi.h>
|
|
#include <shlwapi.h>
|
|
#include <resource.h>
|
|
#include <regstr.h>
|
|
#include <shpriv.h>
|
|
#include <ccstock.h>
|
|
#include <strsafe.h>
|
|
|
|
// device bit entries
|
|
|
|
#ifndef ARRAYSIZE
|
|
#define ARRAYSIZE(x) (sizeof(x) / sizeof((x)[0]))
|
|
#endif
|
|
|
|
#define NUMPAGES 1
|
|
|
|
HFONT g_hTitleFont = NULL;
|
|
HINSTANCE g_hInstance = NULL;
|
|
|
|
////////////////////////////////////////////////////////
|
|
|
|
HRESULT _LoadPath(BOOL fFlash, LPTSTR pszBuffer, UINT cchBuffer)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (!GetWindowsDirectory(pszBuffer, cchBuffer))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
TCHAR szTemp[MAX_PATH];
|
|
if (!LoadString(g_hInstance, fFlash ? IDS_DIR_FLASH : IDS_DIR_HTML, szTemp, ARRAYSIZE(szTemp)))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
if (!PathAppend(pszBuffer, szTemp))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
if (GetSystemDefaultUILanguage() == GetUserDefaultUILanguage()) // not on MUI
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
TCHAR szMUITemplate[16];
|
|
LANGID langid = GetUserDefaultUILanguage();
|
|
|
|
hr = StringCchPrintf(szMUITemplate, ARRAYSIZE(szMUITemplate), TEXT("mui\\%04lx"), langid);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (!PathAppend(pszBuffer, szMUITemplate))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT _DeleteTourBalloon()
|
|
{
|
|
IShellReminderManager* psrm;
|
|
HRESULT hr = CoCreateInstance(CLSID_PostBootReminder, NULL, CLSCTX_INPROC_SERVER,
|
|
IID_PPV_ARG(IShellReminderManager, &psrm));
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = psrm->Delete(L"Microsoft.OfferTour");
|
|
psrm->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT _ExecuteTour(BOOL fFlash)
|
|
{
|
|
TCHAR szDir[MAX_PATH];
|
|
HRESULT hr = _LoadPath(fFlash, szDir, ARRAYSIZE(szDir));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
TCHAR szTarget[MAX_PATH];
|
|
if (!LoadString(g_hInstance, fFlash ? IDS_EXE_FLASH : IDS_EXE_HTML, szTarget, ARRAYSIZE(szTarget)))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
if (32 < (INT_PTR)ShellExecute(NULL, NULL, szTarget, NULL, szDir, SW_SHOWNORMAL))
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT _HaveFlashTour()
|
|
{
|
|
HRESULT hr;
|
|
|
|
TCHAR szHaveLocalizedTour[6];
|
|
if (!LoadString(g_hInstance, IDS_FLASH_LOCALIZED, szHaveLocalizedTour, ARRAYSIZE(szHaveLocalizedTour)))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
// if the string in the .rc is not "TRUE", then we know we don't have a flash tour
|
|
if (0 != StrCmp(szHaveLocalizedTour, TEXT("TRUE")))
|
|
{
|
|
hr = S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
// if the string in the .rc is "TRUE", then we still check if the tour.exe is there
|
|
TCHAR szPath[MAX_PATH];
|
|
hr = _LoadPath(TRUE, szPath, ARRAYSIZE(szPath));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
TCHAR szTarget[MAX_PATH];
|
|
if (!LoadString(g_hInstance, IDS_EXE_FLASH, szTarget, ARRAYSIZE(szTarget)))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
if (!PathAppend(szPath, szTarget))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
if (PathFileExists(szPath))
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = S_FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
INT_PTR _IntroDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
INT_PTR ipRet = FALSE;
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
SetWindowFont(GetDlgItem(hDlg, IDC_TEXT_WELCOME), g_hTitleFont, TRUE);
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY :
|
|
{
|
|
LPNMHDR lpnm = (LPNMHDR) lParam;
|
|
|
|
switch (lpnm->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
|
|
SendMessage(GetDlgItem(hDlg, IDC_RADIO_FLASH), BM_CLICK, 0, 0);
|
|
break;
|
|
case PSN_WIZNEXT:
|
|
if (BST_CHECKED == SendMessage(GetDlgItem(hDlg, IDC_RADIO_FLASH), BM_GETCHECK, 0, 0))
|
|
{
|
|
_ExecuteTour(TRUE);
|
|
}
|
|
else
|
|
{
|
|
_ExecuteTour(FALSE);
|
|
}
|
|
PropSheet_PressButton(GetParent(hDlg), PSBTN_CANCEL);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return ipRet;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
HRESULT Run()
|
|
{
|
|
// Disable the balloon tip
|
|
DWORD dwCount = 0;
|
|
SHRegSetUSValue(REGSTR_PATH_SETUP TEXT("\\Applets\\Tour"), TEXT("RunCount"), REG_DWORD, &dwCount, sizeof(DWORD), SHREGSET_FORCE_HKCU);
|
|
_DeleteTourBalloon();
|
|
|
|
// Before we do anything, check to see if we have the choice of a FLASH tour. If we don't,
|
|
// then we don't need to launch any wizard.
|
|
if (S_OK == _HaveFlashTour())
|
|
{
|
|
// Init common controls
|
|
INITCOMMONCONTROLSEX icex;
|
|
|
|
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
|
icex.dwICC = ICC_USEREX_CLASSES;
|
|
InitCommonControlsEx(&icex);
|
|
|
|
//
|
|
//Create the Wizard page
|
|
//
|
|
PROPSHEETPAGE psp = {0}; //defines the property sheet page
|
|
HPROPSHEETPAGE rghpsp[NUMPAGES]; // an array to hold the page's HPROPSHEETPAGE handles
|
|
psp.dwSize = sizeof(psp);
|
|
psp.hInstance = g_hInstance;
|
|
|
|
psp.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER;
|
|
psp.pszHeaderTitle = NULL;
|
|
psp.pszHeaderSubTitle = NULL;
|
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_INTRO);
|
|
psp.pfnDlgProc = _IntroDlgProc;
|
|
rghpsp[0] = CreatePropertySheetPage(&psp);
|
|
|
|
// create the font
|
|
NONCLIENTMETRICS ncm = {0};
|
|
ncm.cbSize = sizeof(ncm);
|
|
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
|
|
LOGFONT TitleLogFont = ncm.lfMessageFont;
|
|
TitleLogFont.lfWeight = FW_BOLD;
|
|
LoadString(g_hInstance, IDS_TITLELOGFONT, TitleLogFont.lfFaceName, LF_FACESIZE);
|
|
HDC hdc = GetDC(NULL); //gets the screen DC
|
|
if (hdc)
|
|
{
|
|
TitleLogFont.lfHeight = 0 - GetDeviceCaps(hdc, LOGPIXELSY) * 12 / 72;
|
|
g_hTitleFont = CreateFontIndirect(&TitleLogFont);
|
|
ReleaseDC(NULL, hdc);
|
|
}
|
|
|
|
//Create the property sheet
|
|
PROPSHEETHEADER _psh;
|
|
_psh.hInstance = g_hInstance;
|
|
_psh.hwndParent = NULL;
|
|
_psh.phpage = rghpsp;
|
|
_psh.dwSize = sizeof(_psh);
|
|
_psh.dwFlags = PSH_WIZARD97|PSH_WATERMARK|PSH_USEICONID;
|
|
_psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
|
|
_psh.pszIcon = MAKEINTRESOURCE(IDI_WIZ_ICON);
|
|
_psh.nStartPage = 0;
|
|
_psh.nPages = NUMPAGES;
|
|
|
|
|
|
// run property sheet
|
|
PropertySheet(&_psh);
|
|
|
|
// clean up font
|
|
if (g_hTitleFont)
|
|
{
|
|
DeleteObject(g_hTitleFont);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_ExecuteTour(FALSE);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, INT nCmdShow)
|
|
{
|
|
OleInitialize(NULL);
|
|
|
|
g_hInstance = hInstance;
|
|
|
|
Run();
|
|
|
|
OleUninitialize();
|
|
return 0;
|
|
}
|