////////////////////////////////////////////////////////////////////////////// // // MAIN.CPP / Tuneup // // Microsoft Confidential // Copyright (c) Microsoft Corporation 1998 // All rights reserved // // Main tuneup application file. // // Original engineer: WillisC // Updated: Jason Cohen (JCOHEN) // ////////////////////////////////////////////////////////////////////////////// // // Internal include file(s). // #include #include #include "tasks.h" #include "schedwiz.h" #include "howtorun.h" #include "wizard.h" #include "scm.h" // // Global variable(s). // HWND g_hWnd; HINSTANCE g_hInst; DWORD g_dwFlags; LPTASKDATA g_Tasks; LPTASKDATA g_CurrentTask; INT g_nTimeScheme; TCHAR g_szAppName[64]; // // Internal (static) function prototype(s). // static HANDLE GetMutex(VOID); static HWND CheckPrevInst(LPHANDLE); static BOOL TanslateCommandLine(LPTSTR); // // Main windows function. // INT PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { HANDLE hMutex; HWND hWnd; LPTSTR *lpArgs = NULL; DWORD dwArgs, dwIndex; BOOL bRunWizard; // First we will init any global memory we need to. // g_hInst = hInstance; g_nTimeScheme = 0; g_dwFlags = 0; LoadString(hInstance, IDS_TUNEUP, g_szAppName, sizeof(g_szAppName) / sizeof(TCHAR)); // This will setup any command line options first. // dwArgs = GetCommandLineOptions(&lpArgs); for (dwIndex = 1; dwIndex < dwArgs; dwIndex++) TanslateCommandLine((LPTSTR) *(lpArgs + dwIndex)); FREE(lpArgs); // If we proccessed a command line option that is designed to // not run tuneup, we should return now. // if ( g_dwFlags & TUNEUP_QUIT ) return TRUE; // Now check for another instance of Tuneup. // if ( hWnd = CheckPrevInst(&hMutex) ) { SetForegroundWindow(hWnd); return FALSE; } // We now need to create the job tasks. // g_Tasks = CreateTasks(); InitJobs(g_Tasks); // Now we should pick up any data from the registry that we need. // if ( RegExists(HKLM, g_szTuneupKey, g_szRegValFirstTime) ) { // Get previous time scheme. // g_nTimeScheme = RegGetDword(HKLM, g_szTuneupKey, g_szRegValTime); // Get previous express or custom. // if ( RegCheck(HKLM, g_szTuneupKey, g_szRegValCustom) ) g_dwFlags |= TUNEUP_CUSTOM; // Display the how to run dialog. If TRUE is // returned, we should run the wizard. Otherwise // the user choose cancel or the tasks were all run // and we should just return. // bRunWizard = HowToRun(); } else { // Set the flag so that tuneup knows this is // the first time it has been run. // g_dwFlags |= TUNEUP_NOSCHEDULE; // Set this so that we do run the wizard. // bRunWizard = TRUE; } // Now set any default values that should be set. // if ( g_nTimeScheme == 0) g_nTimeScheme = DEFAULT_TIMESCHEME; // Start the wizard if we need to. // if ( bRunWizard ) CreateWizard(hInstance, NULL); // Free the job tasks we created. // FreeTasks(g_Tasks); // Release the mutex. // if (hMutex) ReleaseMutex(hMutex); return TRUE; } // // Internal function(s). // static HANDLE GetMutex() { const TCHAR szTuneupMutex[] = _T("TUNEUP97MUTEX"); HANDLE hMutex; // Try to open the Tuneup mutex. // if ( hMutex = OpenMutex(SYNCHRONIZE, FALSE, szTuneupMutex) ) { // There is already another mutex, so we can't get one // and there should be another Tuneup window to find. // CloseHandle(hMutex); hMutex = NULL; } else { // No mutex is present, so we should be able to get one. // hMutex = CreateMutex(NULL, FALSE, szTuneupMutex); } // Return the mutex, will be NULL if there alread is one. // return hMutex; } static HWND CheckPrevInst(LPHANDLE hMutex) { HWND hWnd = NULL; BOOL bPrev = FALSE; int nCount; // Loop until another tuneup window is found or a mutex can // be created. Max of 10 times (10 seconds). // for (nCount = 0; (nCount < 10) && (!bPrev) && ( (*hMutex = GetMutex()) == NULL ); nCount++) { #if 0 // Check for the background window of the wizard. // if ( bPrev = ( ( hWnd = FindWindow(NULL, g_szAppName) ) != NULL ) ) { // The background window was found, so show the prev one (i.e. Wizard). // hWnd = GetWindow(hWnd, GW_HWNDPREV); } else { // Check for the how to run dialog. // bPrev = ( ( hWnd = FindWindow(NULL, g_szAppName) ) != NULL ); } #else bPrev = ( ( hWnd = FindWindow(NULL, g_szAppName) ) != NULL ); #endif // If we found no window, sleep for 1 second. // if (!bPrev) Sleep(1000); } // Return the window handle of any previous instance (will be null if we // didn't find or we got a mutex). // return hWnd; } static BOOL TanslateCommandLine(LPTSTR lpArg) { BOOL bTranslated = TRUE; // Check for the /AUTORUN flag. // if ( _tcsicmp(_T("/AUTORUN"), lpArg) == 0 ) g_dwFlags |= TUNEUP_AUTORUN; // Check for the /SERVICE: flag. // else if ( _tcsnicmp(_T("/SERVICE:"), lpArg, 9) == 0 ) { ServiceStart(lpArg + 9); g_dwFlags |= TUNEUP_QUIT; } // Unknown option. // else bTranslated = FALSE; return bTranslated; }