|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
StartD.cpp : implementation file
File History:
JonY Jan-96 created
--*/
#include "stdafx.h"
#include "Mustard.h"
#include "wizlist.h"
#include "StartD.h"
#include "Listdata.h"
#include <winreg.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
LPITEMIDLIST CreatePIDL(UINT cbSize); LPITEMIDLIST ConcatPIDLs(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); LPITEMIDLIST Next(LPCITEMIDLIST pidl); UINT GetSize(LPCITEMIDLIST pidl);
/////////////////////////////////////////////////////////////////////////////
// CStartD dialog
CStartD::CStartD(CWnd* pParent /*=NULL*/) : CDialog(CStartD::IDD, pParent), m_bActive(TRUE), m_hAccelTable(NULL) { //{{AFX_DATA_INIT(CStartD)
m_bStartup = TRUE; //}}AFX_DATA_INIT
m_pFont1 = NULL; m_pFont2 = NULL;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
// Load the accelerator tables.
m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1)); }
CStartD::~CStartD() { if (m_pFont1 != NULL) delete m_pFont1; // if (m_pFont2 != NULL) delete m_pFont2;
} void CStartD::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CStartD)
DDX_Control(pDX, IDC_WIZ_LIST2, m_lbWizList2); DDX_Control(pDX, IDC_WIZ_LIST, m_lbWizList); DDX_Check(pDX, IDC_STARTUP, m_bStartup); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CStartD, CDialog) //{{AFX_MSG_MAP(CStartD)
ON_WM_PAINT() ON_BN_CLICKED(IDC_QUIT_BUTTON, OnQuitButton) ON_WM_ACTIVATEAPP() ON_WM_QUERYDRAGICON() ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP
ON_COMMAND(ID_ACCEL_GROUP, OnAccelGroup) ON_COMMAND(ID_ACCEL_MODEM, OnAccelModem) ON_COMMAND(ID_ACCEL_NETWORK, OnAccelNetwork) ON_COMMAND(ID_ACCEL_PRINT, OnAccelPrint) ON_COMMAND(ID_ACCEL_SHARE, OnAccelShare) ON_COMMAND(ID_ACCEL_USER, OnAccelUser) ON_COMMAND(ID_ACCEL_PROGRAMS, OnAccelPrograms) ON_COMMAND(ID_ACCEL_LICENSE, OnAccelLicense) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStartD message handlers
BOOL CStartD::OnInitDialog() { CDialog::OnInitDialog();
// tell the two sides about each other
m_lbWizList2.m_pOtherGuy = &m_lbWizList; m_lbWizList.m_pOtherGuy = &m_lbWizList2;
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// font information for the headings
m_pFont1 = new CFont; LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT)); // Clear out structure.
CString fontname; fontname.LoadString(IDS_FONT_NAME); _tcscpy(lf.lfFaceName, fontname);
CString fontheight; fontheight.LoadString(IDS_BIGFONT_SIZE); lf.lfHeight = (LONG)_tcstoul(fontheight, NULL, 10);
lf.lfWeight = 700; m_pFont1->CreateFontIndirect(&lf); // Create the font.
CString cs; cs.LoadString(IDS_CAPTION); CWnd* pWnd = GetDlgItem(IDC_STATIC1); pWnd->SetWindowText(cs); pWnd->SetFont(m_pFont1);
CMustardApp* pApp = (CMustardApp*)AfxGetApp();
// get install dir
TCHAR pSysDir[256]; UINT nLen = GetWindowsDirectory(pSysDir, 256); if (*(pSysDir + nLen) != '\\') _tcscat(pSysDir, L"\\"); _tcscat(pSysDir, L"SYSTEM32\\");
// Add User
CItemData* pData = new CItemData; pData->csName.LoadString(IDS_USER_NAME);// = L"Add User";
pData->csDesc.LoadString(IDS_USER_DESC);// = L"Add User";
pData->csAppStart1 = pSysDir + CString(L"addusrw.exe"); pData->csAppStart2 = L"";
GetIconIndices(pData->csAppStart1, &pData->hIcon, &pData->hSelIcon); m_lbWizList.InsertString(0, _T("")); m_lbWizList.SetItemData(0, (LONG_PTR)pData);
// Group Creation
pData = new CItemData; pData->csName.LoadString(IDS_GROUP_NAME);// = L"Group Creation";
pData->csDesc.LoadString(IDS_GROUP_DESC);// = L"Group Creation";
pData->csAppStart1 = pSysDir + CString(L"addgrpw.exe"); pData->csAppStart2 = L"";
GetIconIndices(pData->csAppStart1, &pData->hIcon, &pData->hSelIcon);
m_lbWizList.InsertString(1, _T("")); m_lbWizList.SetItemData(1, (LONG_PTR)pData);
// Share Publishing / folder security
pData = new CItemData; pData->csName.LoadString(IDS_SHRPUB_NAME);// = L"Share Publishing";
pData->csDesc.LoadString(IDS_SHRPUB_DESC);// = L"Share Publishing ";
pData->csAppStart1 = pSysDir + CString(L"shrpubw.exe"); pData->csAppStart2 = L"";
GetIconIndices(pData->csAppStart1, &pData->hIcon, &pData->hSelIcon); m_lbWizList.InsertString(2, _T("")); m_lbWizList.SetItemData(2, (LONG_PTR)pData);
// printer
pData = new CItemData; pData->csName.LoadString(IDS_PRINT_NAME);// = L"Add Printer";
pData->csDesc.LoadString(IDS_PRINT_DESC);// = L"Print manager";
pData->csAppStart1 = L""; pData->csAppStart2 = L"";
GetCPLIcon(IDS_ADD_PRINTER, &pData->hIcon, &pData->hSelIcon, TRUE);
m_lbWizList.InsertString(3, _T("")); m_lbWizList.SetItemData(3, (LONG_PTR)pData);
// Add/remove software
pData = new CItemData; pData->csName.LoadString(IDS_ARS_NAME);// = L"Add/Remove software";
pData->csDesc.LoadString(IDS_ARS_DESC);// = L"Add/Remove software";
pData->csAppStart1 = L"control.exe"; pData->csAppStart2 = L"appwiz.cpl";
GetCPLIcon(IDS_APPWIZ, &pData->hIcon, &pData->hSelIcon); m_lbWizList2.InsertString(0, _T("")); m_lbWizList2.SetItemData(0, (LONG_PTR)pData);
// modem
pData = new CItemData; pData->csName.LoadString(IDS_MODEM_NAME);// = L"Add Modem";
pData->csDesc.LoadString(IDS_MODEM_DESC);// = L"Modems, ports, etc";
pData->csAppStart1 = L"control.exe"; pData->csAppStart2 = L"modem.cpl";
GetCPLIcon(IDS_MODEM, &pData->hIcon, &pData->hSelIcon);
m_lbWizList2.InsertString(1, _T("")); m_lbWizList2.SetItemData(1, (LONG_PTR)pData);
// Workstation installation
pData = new CItemData; pData->csName.LoadString(IDS_WKSSETUP_NAME);// = L"Workstation Installation";
pData->csDesc.LoadString(IDS_WKSSETUP_DESC);// = L"Workstation Installation";
pData->csAppStart1 = pSysDir + CString(L"ncadmin.exe"); pData->csAppStart2 = L"";
GetIconIndices(pData->csAppStart1, &pData->hIcon, &pData->hSelIcon);
m_lbWizList2.InsertString(2, _T("")); m_lbWizList2.SetItemData(2, (LONG_PTR)pData); // license compliancy
pData = new CItemData; pData->csName.LoadString(IDS_FDS_NAME); pData->csDesc.LoadString(IDS_FDS_DESC);
pData->csAppStart1 = pSysDir + CString(L"lcwiz.exe"); pData->csAppStart2 = L"";
GetIconIndices(pData->csAppStart1, &pData->hIcon, &pData->hSelIcon);
m_lbWizList2.InsertString(3, _T("")); m_lbWizList2.SetItemData(3, (LONG_PTR)pData);
// check the registry to see if we are loaded automatically at startup
DWORD dwRet; HKEY hKey; DWORD cbProv = 0; TCHAR* lpProv = NULL;
dwRet = RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows"), &hKey );
TCHAR* lpStartup = NULL; if ((dwRet = RegQueryValueEx( hKey, TEXT("run"), NULL, NULL, NULL, &cbProv )) == ERROR_SUCCESS) { lpStartup = (TCHAR*)malloc(cbProv); if (lpStartup == NULL) { AfxMessageBox(IDS_GENERIC_NO_HEAP, MB_ICONEXCLAMATION); ExitProcess(1); } dwRet = RegQueryValueEx( hKey, TEXT("run"), NULL, NULL, (LPBYTE) lpStartup, &cbProv ); // see if we are included
if (_tcsstr(lpStartup, L"wizmgr.exe") != NULL) m_bStartup = TRUE; else m_bStartup = FALSE; UpdateData(FALSE); }
free(lpStartup); RegCloseKey(hKey);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CStartD::OnPaint() { CPaintDC dc(this); // device context for painting
if (IsIconic()) {
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon); }
else { CPen pBlackPen(PS_SOLID, 1, RGB(0,0,0)); CPen* pOriginalPen = (CPen*)dc.SelectObject(pBlackPen); dc.MoveTo(596, 77); dc.LineTo(2, 77); dc.LineTo(2, 362);
CPen pLtGreyPen(PS_SOLID, 1, RGB(192, 192, 192)); dc.SelectObject(pLtGreyPen); dc.LineTo(596, 362); dc.LineTo(596, 77);
CPen pDkGreyPen(PS_SOLID, 1, RGB(128, 128, 128)); dc.SelectObject(pDkGreyPen); dc.MoveTo(597, 76); dc.LineTo(1, 76); dc.LineTo(1, 363);
CPen pWhitePen(PS_SOLID, 1, RGB(255, 255, 255)); dc.SelectObject(pWhitePen); dc.MoveTo(2, 363); dc.LineTo(598, 363); dc.LineTo(598, 76); } // Do not call CDialog::OnPaint() for painting messages
}
HCURSOR CStartD::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }
void CStartD::OnQuitButton() { CItemData* pData; ULONG_PTR lData;
USHORT us = 0; while((lData = m_lbWizList.GetItemData(us)) != LB_ERR) { pData = (CItemData*)lData; delete pData; m_lbWizList.DeleteString(us); }
while((lData = m_lbWizList2.GetItemData(us)) != LB_ERR) { pData = (CItemData*)lData; delete pData; m_lbWizList2.DeleteString(us); } // set the reg value for startup
UpdateData(TRUE);
DWORD dwRet; HKEY hKey; DWORD cbProv = 0; TCHAR* lpProv = NULL;
dwRet = RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows"), &hKey );
TCHAR* lpStartup = NULL; if ((dwRet = RegQueryValueEx( hKey, TEXT("run"), NULL, NULL, NULL, &cbProv )) == ERROR_SUCCESS) { lpStartup = (TCHAR*)malloc(cbProv); if (lpStartup == NULL) { AfxMessageBox(IDS_GENERIC_NO_HEAP, MB_ICONEXCLAMATION); ExitProcess(1); } dwRet = RegQueryValueEx( hKey, TEXT("run"), NULL, NULL, (LPBYTE) lpStartup, &cbProv );
// see if we are included
TCHAR* pPos; if ((pPos = _tcsstr(lpStartup, L"wizmgr.exe")) != NULL) // included
{ if (!m_bStartup) // don't want to be
{ UINT nPos = (UINT)(pPos - lpStartup); CString csCurrentValue = lpStartup; CString csNewVal = csCurrentValue.Left(nPos); csNewVal += csCurrentValue.Right(csCurrentValue.GetLength() - nPos - _tcslen(L"wizmgr.exe")); RegSetValueEx(hKey, TEXT("run"), 0, REG_SZ, (BYTE *)csNewVal.GetBuffer(csNewVal.GetLength()), csNewVal.GetLength() * sizeof(TCHAR)); } } else // not included
{ if (m_bStartup) // want to be
{ CString csNewVal = lpStartup; csNewVal += L" wizmgr.exe"; RegSetValueEx(hKey, TEXT("run"), 0, REG_SZ, (BYTE *)csNewVal.GetBuffer(csNewVal.GetLength()), csNewVal.GetLength() * sizeof(TCHAR)); } }
UpdateData(FALSE); }
free(lpStartup); RegCloseKey(hKey);
EndDialog(1); }
void CStartD::OnActivateApp(BOOL bActive, HTASK hTask) { CDialog::OnActivateApp(bActive, hTask); m_bActive = bActive;
// Remove the selections from the list boxes if
// the application is being deactivated.
if (!m_bActive) { m_lbWizList.SetCurSel(-1); m_lbWizList2.SetCurSel(-1); } }
void CStartD::OnMouseMove(UINT nFlags, CPoint point) { if (m_bActive) { // Remove the selection from the list boxes if
// the mouse has moved outside of them.
m_lbWizList.SetCurSel(-1); m_lbWizList2.SetCurSel(-1); }
CDialog::OnMouseMove(nFlags, point); }
BOOL CStartD::PreTranslateMessage(MSG* pMsg) { if (m_hAccelTable != NULL) { if (!TranslateAccelerator(GetSafeHwnd(), m_hAccelTable, pMsg) ) return CDialog::PreTranslateMessage(pMsg); else return TRUE; }
return CDialog::PreTranslateMessage(pMsg); }
void CStartD::HandleAccelerator1(USHORT nIndex) { // Change the selection in the listbox and
// make it think it's been clicked.
// Remove the selection from the other listbox, too.
m_lbWizList.SetCurSel(nIndex); m_lbWizList2.SetCurSel(-1); m_lbWizList.PostMessage(WM_LBUTTONDOWN); }
void CStartD::HandleAccelerator2(USHORT nIndex) { m_lbWizList2.SetCurSel(nIndex); m_lbWizList.SetCurSel(-1); m_lbWizList2.PostMessage(WM_LBUTTONDOWN); }
void CStartD::OnAccelUser() { HandleAccelerator1(ACCEL_USER); }
void CStartD::OnAccelGroup() { HandleAccelerator1(ACCEL_GROUP); }
void CStartD::OnAccelShare() { HandleAccelerator1(ACCEL_SHARE); }
void CStartD::OnAccelPrint() { HandleAccelerator1(ACCEL_PRINT); }
void CStartD::OnAccelPrograms() { HandleAccelerator2(ACCEL_PROGRAMS); }
void CStartD::OnAccelModem() { HandleAccelerator2(ACCEL_MODEM); }
void CStartD::OnAccelNetwork() { HandleAccelerator2(ACCEL_NETWORK); }
void CStartD::OnAccelLicense() { HandleAccelerator2(ACCEL_LICENSE); }
void CStartD::GetIconIndices(LPCTSTR pszPathName, HICON* hiNormal, HICON* hiSelected) { SHFILEINFO sfi;
// Get the index for the normal icon.
SHGetFileInfo(pszPathName, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON); *hiNormal = sfi.hIcon;
// Get the index for the selected icon.
SHGetFileInfo(pszPathName, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SELECTED); *hiSelected = sfi.hIcon; }
void CStartD::GetCPLIcon(UINT pszCplItem, HICON* hiNormal, HICON* hiSelected, BOOL bPrinters) { LPSHELLFOLDER pshf, pshfCPLItem; LPITEMIDLIST pidlCPLFolder, pidlCPLObj; LPMALLOC pMalloc; HRESULT hr;
// Get a pointer to the shell's IMalloc interface.
hr = SHGetMalloc(&pMalloc); if (SUCCEEDED(hr) && pMalloc) // JonN 01/26/00: PREFIX bug 445827
{ // Get a pointer to the shell's IShellFolder interface.
hr = SHGetDesktopFolder(&pshf);
if (SUCCEEDED(hr)) { // Get a PIDL for the specified folder.
if (!bPrinters) hr = SHGetSpecialFolderLocation(GetSafeHwnd(), CSIDL_CONTROLS, &pidlCPLFolder); else hr = SHGetSpecialFolderLocation(GetSafeHwnd(), CSIDL_PRINTERS, &pidlCPLFolder);
if (SUCCEEDED(hr)) { hr = pshf->BindToObject(pidlCPLFolder, NULL, IID_IShellFolder, (LPVOID*)&pshfCPLItem); if (SUCCEEDED(hr)) GetCPLObject(pszCplItem, pshfCPLItem, &pidlCPLObj, hiNormal, hiSelected, pidlCPLFolder);
} pMalloc->Free(pidlCPLFolder); } pMalloc->Release(); } }
HRESULT CStartD::GetCPLObject(UINT pszCplItem, LPSHELLFOLDER pshf, LPITEMIDLIST* ppidl, HICON* hiNormal, HICON* hiSelected, LPITEMIDLIST pParentPIDL) { HRESULT hr; LPENUMIDLIST pEnum; LPMALLOC pMalloc;
// Get a pointer to the shell's IMalloc interface.
hr = SHGetMalloc(&pMalloc);
if (SUCCEEDED(hr)) { // Get a pointer to the folder's IEnumIDList interface.
hr = pshf->EnumObjects(GetSafeHwnd(), SHCONTF_NONFOLDERS, &pEnum);
if (SUCCEEDED(hr)) { STRRET str; CString strCPLObj, strEnumObj;
// Load the display name for the control panel object.
strCPLObj.LoadString(pszCplItem);
// Enumerate the objects in the control panel folder.
while (pEnum->Next(1, ppidl, NULL) == NOERROR) { // Get the display name for the object.
hr = pshf->GetDisplayNameOf((LPCITEMIDLIST)*ppidl, SHGDN_INFOLDER, &str);
if (SUCCEEDED(hr)) { // Copy the display name to the strEnumObj string.
switch (str.uType) { case STRRET_CSTR: strEnumObj = str.cStr; break;
case STRRET_OFFSET: char pStr[255]; strcpy(pStr, (LPCSTR)(((UINT_PTR)*ppidl) + str.uOffset)); TCHAR wStr[255]; mbstowcs(wStr, pStr, 255); strEnumObj = wStr; break;
case STRRET_WSTR: strEnumObj = str.pOleStr; break;
case 0x04: strEnumObj = (LPCTSTR)(((UINT_PTR)*ppidl) + str.uOffset); break;
case 0x05: { TCHAR pStr[255]; memcpy(pStr, str.cStr, 255); strEnumObj = pStr; break; } default: strEnumObj.Empty(); }
// If we found the correct object, exit the loop.
if (strCPLObj == strEnumObj) { LPITEMIDLIST pBigPIDL = ConcatPIDLs(pParentPIDL, *ppidl); SHFILEINFO sfi; // Get the index for the normal icon.
SHGetFileInfo((LPCTSTR)pBigPIDL, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_PIDL); *hiNormal = sfi.hIcon;
// Get the index for the selected icon.
SHGetFileInfo((LPCTSTR)pBigPIDL, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SELECTED | SHGFI_PIDL); *hiSelected = sfi.hIcon;
} // Free the PIDL returned by IEnumIDList::Next().
pMalloc->Free(*ppidl);
if (FAILED(hr)) { TRACE(_T("IMalloc::Free failed.\n")); break; } } else { TRACE(_T("IShellFolder::GetDisplayNameOf failed.\n")); } }
// Release the IEnumIDList pointer.
pEnum->Release(); } else { TRACE(_T("IShellFolder::EnumObjects failed.\n")); }
// Release the IMalloc pointer.
pMalloc->Release(); }
return hr; }
/****************************************************************************
* * FUNCTION: Create(UINT cbSize) * * PURPOSE: Allocates a PIDL * ****************************************************************************/ LPITEMIDLIST CreatePIDL(UINT cbSize) { LPMALLOC lpMalloc; HRESULT hr; LPITEMIDLIST pidl=NULL;
hr=SHGetMalloc(&lpMalloc);
if (FAILED(hr)) return 0;
pidl=(LPITEMIDLIST)lpMalloc->Alloc(cbSize);
if (pidl) memset(pidl, 0, cbSize); // zero-init for external task alloc
if (lpMalloc) lpMalloc->Release();
return pidl; }
/****************************************************************************
* * FUNCTION: ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) * * PURPOSE: Concatenates two PIDLs * ****************************************************************************/ LPITEMIDLIST ConcatPIDLs(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { LPITEMIDLIST pidlNew; UINT cb1; UINT cb2;
if (pidl1) //May be NULL
cb1 = GetSize(pidl1) - sizeof(pidl1->mkid.cb); else cb1 = 0;
cb2 = GetSize(pidl2);
pidlNew = CreatePIDL(cb1 + cb2); if (pidlNew) { if (pidl1) memcpy(pidlNew, pidl1, cb1); memcpy(((LPSTR)pidlNew) + cb1, pidl2, cb2); } return pidlNew; } /****************************************************************************
* * FUNCTION: Next(LPCITEMIDLIST pidl) * * PURPOSE: Gets the next PIDL in the list * ****************************************************************************/ LPITEMIDLIST Next(LPCITEMIDLIST pidl) { LPSTR lpMem=(LPSTR)pidl;
lpMem+=pidl->mkid.cb;
return (LPITEMIDLIST)lpMem; }
/****************************************************************************
* * FUNCTION: GetSize(LPCITEMIDLIST pidl) * * PURPOSE: Gets the size of the PIDL * ****************************************************************************/ UINT GetSize(LPCITEMIDLIST pidl) { UINT cbTotal = 0; if (pidl) { cbTotal += sizeof(pidl->mkid.cb); // Null terminator
while (pidl->mkid.cb) { cbTotal += pidl->mkid.cb; pidl = Next(pidl); } }
return cbTotal; }
|