BOOL InitApp (LPSTR pszCmdLineA) { BOOL fShow = FALSE; BOOL fQuiet = FALSE; BOOL fExit = FALSE; BOOL fInstall = FALSE; BOOL fUninstall = FALSE; BOOL fAutoInit = FALSE; BOOL fNetDetect = FALSE; BOOL fRenewMaps = FALSE; // Initialize our global variables and window classes // memset (&g, 0x00, sizeof(g)); g.fStartup = TRUE; // Parse the command-line // while (pszCmdLineA && *pszCmdLineA) { if ((*pszCmdLineA != '-') && (*pszCmdLineA != '/')) break; switch (*(++pszCmdLineA)) { case 'a': case 'A': fAutoInit = TRUE; break; case 'm': case 'M': fRenewMaps = TRUE; break; case 'n': case 'N': fNetDetect = TRUE; break; case 's': case 'S': fShow = TRUE; break; case 'q': case 'Q': fQuiet = TRUE; break; case 'e': case 'E': fExit = TRUE; break; case 'i': case 'I': fInstall = TRUE; break; case 'u': case 'U': fUninstall = TRUE; break; case ':': CopyAnsiToString(g.SmbName,pszCmdLineA); MapShareName(pszCmdLineA); break; case 'z': case 'Z': DoUnMapShare(TRUE); return(0); case 'x': case 'X': TestAndDoMapShare(SERVICE_START_PENDING); TestAndDoMapShare(SERVICE_RUNNING); return 0; } while (*pszCmdLineA && (*pszCmdLineA != ' ')) ++pszCmdLineA; if (*pszCmdLineA==' ') ++pszCmdLineA; } if (fInstall) Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = TRUE); else if (fUninstall) Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = FALSE); if (fInstall || fUninstall) { HKEY hk; if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, NULL, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize); RegCloseKey (hk); } } // Only show up if there's not another version of this app around already. // for (HWND hSearch = GetWindow (GetDesktopWindow(), GW_CHILD); hSearch && IsWindow(hSearch); hSearch = GetWindow (hSearch, GW_HWNDNEXT)) { TCHAR szClassName[ cchRESOURCE ]; if (GetClassName (hSearch, szClassName, cchRESOURCE)) { if (!lstrcmpi (szClassName, cszCLASSNAME)) { if (fShow) PostMessage (hSearch, WM_COMMAND, M_ACTIVATE, 0); else if (fExit) PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0); else if (fUninstall) PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0); return FALSE; } } } if (fExit || fUninstall || fInstall) return FALSE; HKEY hk; if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); RegCloseKey (hk); } else if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); RegCloseKey (hk); } Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup); // Is this Windows NT? // OSVERSIONINFO Version; memset (&Version, 0x00, sizeof(Version)); Version.dwOSVersionInfoSize = sizeof(Version); if (GetVersionEx (&Version)) g.fIsWinNT = (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) ? TRUE : FALSE; if (!g.fIsWinNT) lstrcpy (g.szHelpFile, TEXT("afs-light.hlp")); else lstrcpy (g.szHelpFile, TEXT("afs-nt.hlp")); // Initialize winsock etc // WSADATA Data; WSAStartup (0x0101, &Data); InitCommonControls(); RegisterCheckListClass(); osi_Init(); lock_InitializeMutex(&g.expirationCheckLock, "expiration check lock", 0); lock_InitializeMutex(&g.credsLock, "global creds lock", 0); KFW_AFS_wait_for_service_start(); if ( IsDebuggerPresent() ) { if ( !g.fIsWinNT ) OutputDebugString("No Service Present on non-NT systems\n"); else { if ( IsServiceRunning() ) OutputDebugString("AFSD Service started\n"); else { OutputDebugString("AFSD Service stopped\n"); if ( !IsServiceConfigured() ) OutputDebugString("AFSD Service not configured\n"); else if ( fAutoInit ) OutputDebugString("AFSD Service will be started\n"); } } } // If the service isn't started yet, and autoInit start the service if ( g.fIsWinNT && !IsServiceRunning() && IsServiceConfigured() && fAutoInit ) { SC_HANDLE hManager; if ((hManager = OpenSCManager( NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_QUERY_LOCK_STATUS)) != NULL ) { SC_HANDLE hService; if ((hService = OpenService( hManager, TEXT("TransarcAFSDaemon"), SERVICE_QUERY_STATUS | SERVICE_START) ) != NULL) { if (StartService(hService, 0, 0)) { if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service start successful\n"); fRenewMaps = TRUE; } else if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service start failed\n"); CloseServiceHandle (hService); } CloseServiceHandle (hManager); } KFW_AFS_wait_for_service_start(); } KFW_initialize(); // Create a main window. All further initialization will be done during // processing of WM_INITDIALOG. // WNDCLASS wc; if (!GetClassInfo (NULL, WC_DIALOG, &wc)) // Get dialog class info return FALSE; wc.hInstance = THIS_HINST; wc.hIcon = TaLocale_LoadIcon (IDI_MAIN); wc.lpszClassName = cszCLASSNAME; wc.style |= CS_GLOBALCLASS; RegisterClass(&wc); g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DlgProc); if (g.hMain == NULL) return FALSE; // If the service isn't started yet, show our startup wizard. // if (!IsServiceRunning() && !fQuiet) { if (!g.fIsWinNT) Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95); else if (IsServiceConfigured()) ShowStartupWizard(); else if (!IsServerInstalled()) Message (MB_ICONHAND, IDS_UNCONFIG_TITLE, IDS_UNCONFIG_DESC); } if (IsServiceRunning()) { if ( fRenewMaps ) { if ( IsDebuggerPresent() ) OutputDebugString("Renewing Drive Maps\n"); DoMapShareChange(FALSE); } if (fShow) { if ( IsDebuggerPresent() ) OutputDebugString("Displaying Main window\n"); Main_Show (TRUE); } // If the root cell is reachable and we have no tokens // display the Obtain Tokens dialog to the user if ( fAutoInit ) { if ( IsDebuggerPresent() ) OutputDebugString("Obtaining Tokens (if needed)\n"); ObtainTokensFromUserIfNeeded(g.hMain); } } else if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service Stopped\n"); if ( fNetDetect ) { // Start IP Address Change Monitor if ( IsDebuggerPresent() ) OutputDebugString("Activating Network Change Monitor\n"); IpAddrChangeMonitorInit(g.hMain); } Main_EnableRemindTimer(TRUE); return TRUE; }
void ChangeTrayIcon (int nim) { static BOOL fAdded = FALSE; static BOOL fDeleted = FALSE; if ((nim == NIM_MODIFY) && (!fAdded)) nim = NIM_ADD; if ((nim == NIM_MODIFY) && (fDeleted)) return; if ((nim != NIM_DELETE) || (IsWindow (g.hMain))) { static HICON ICON_CREDS_YES = TaLocale_LoadIcon (IDI_CREDS_YES); static HICON ICON_CREDS_NO = TaLocale_LoadIcon (IDI_CREDS_NO); size_t iExpired = Main_FindExpiredCreds(); NOTIFYICONDATA nid; memset (&nid, 0x00, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = g.hMain; nid.uID = 0; nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = WM_TRAYICON; lock_ObtainMutex(&g.credsLock); nid.hIcon = ((g.cCreds != 0) && (iExpired == (size_t)-1)) ? ICON_CREDS_YES : ICON_CREDS_NO; lock_ReleaseMutex(&g.credsLock); GetString (nid.szTip, (g.fIsWinNT) ? IDS_TOOLTIP : IDS_TOOLTIP_95); Shell_NotifyIcon (nim, &nid); } if (nim == NIM_ADD) fAdded = TRUE; if (nim == NIM_DELETE) fDeleted = TRUE; }
void Subsets_OpenSave_OnInitDialog (HWND hDlg, LPSUBSET_OPENSAVE_PARAMS lpp) { // Fix the buttons in the toolbar, so that they looks pretty // HWND hButton = GetDlgItem (hDlg, IDC_SUBSET_DELETE); HICON hi = TaLocale_LoadIcon (IDI_BTN_DELETE); SendMessage (hButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hi); hButton = GetDlgItem (hDlg, IDC_SUBSET_RENAME); hi = TaLocale_LoadIcon (IDI_BTN_RENAME); SendMessage (hButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hi); // Set up an ImageList so we'll have icons in the ListView // HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST); HIMAGELIST hil = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1); hi = TaLocale_LoadIcon (IDI_SUBSET); ImageList_AddIcon (hil, hi); ListView_SetImageList (hList, hil, LVSIL_SMALL); // Then populate the ListView with the names of the subsets // defined for this cell // Subsets_OpenSave_Populate (hDlg); // Finally, fill in the rest of the dialog. // SetDlgItemText (hDlg, IDC_SUBSET_NAME, lpp->szSubset); TCHAR szText[ cchRESOURCE ]; GetString (szText, (lpp->fOpen) ? IDS_SUBSET_TITLE_LOAD : IDS_SUBSET_TITLE_SAVE); SetWindowText (hDlg, szText); GetString (szText, (lpp->fOpen) ? IDS_BUTTON_OPEN : IDS_BUTTON_SAVE); SetDlgItemText (hDlg, IDOK, szText); }
BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow) { TaLocale_LoadCorrespondingModule (hInst); memset (&g, 0x00, sizeof(g)); g.hInst = hInst; g.hAccel = TaLocale_LoadAccelerators (ACCEL_MAIN); HWND hPrevious; TCHAR szTitle[ cchRESOURCE ]; GetString (szTitle, IDS_APP_TITLE); if ((hPrevious = FindWindow (TEXT("AFSAccountManagerClass"), szTitle)) != NULL) { SetFocus (hPrevious); SendMessage (hPrevious, WM_SHOW_YOURSELF, 0, 0); return FALSE; } AfsAppLib_SetAppName(szTitle); AfsAppLib_SetPumpRoutine(PumpMessage); TASKQUEUE_PARAMS tqp; memset (&tqp, 0x00, sizeof(tqp)); tqp.nThreadsMax = 10; tqp.fnCreateTaskPacket = CreateTaskPacket; tqp.fnPerformTask = PerformTask; tqp.fnFreeTaskPacket = FreeTaskPacket; AfsAppLib_InitTaskQueue (&tqp); Main_ConfigureHelp(); // Determine how the app is supposed to look--that is, remember what it // looked like last time, and if there was no "last time", pick some // decent defaults. // if (!RestoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED)) { memset (&gr, 0x00, sizeof(gr)); SetRectEmpty (&gr.rMain); gr.cminRefreshRate = 60; // 1 hour default refresh rate User_SetDefaultCreateParams (&gr.CreateUser); Group_SetDefaultCreateParams (&gr.CreateGroup); Machine_SetDefaultCreateParams (&gr.CreateMachine); Actions_SetDefaultView (&gr.viewAct); User_SetDefaultView (&gr.viewUsr, &gr.ivUsr); Group_SetDefaultView (&gr.viewGrp, &gr.ivGrp); Machine_SetDefaultView (&gr.viewMch, &gr.ivMch); Users_SetDefaultSearchParams (&gr.SearchUsers); } // Create a variation on WC_DIALOG, so we get appropriate icons on // our windows. // WNDCLASS wc; GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc); wc.hInstance = THIS_HINST; wc.hIcon = TaLocale_LoadIcon (IDI_MAIN); wc.lpszClassName = TEXT("AFSAccountManagerClass"); wc.style |= CS_GLOBALCLASS; RegisterClass (&wc); // Okay, the big step: create the main window. Note that it doesn't // get shown yet! // CMDLINEOP op = ParseCommandLine (pszCmdLine); if (op == opCLOSEAPP) return FALSE; // Okay, the big step: create the main window. // Note that it doesn't get shown yet! // g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DialogProc); if (g.hMain == NULL) return FALSE; if (op != opNOCELLDIALOG) { if (OpenCellDialog() != IDOK) return FALSE; } return TRUE; }
/* * EXPORTED FUNCTIONS _________________________________________________________ * */ extern "C" LONG APIENTRY CPlApplet(HWND hwndCPl, UINT uMsg, LONG lParam1, LONG lParam2) { int i; LPNEWCPLINFO lpNewCPlInfo; HICON hIcon; static char szAppName[64]; static char szAppPath[MAX_PATH]; i = (int)lParam1; switch (uMsg) { case CPL_INIT: /* first message, sent once */ hinst = GetModuleHandle("afsserver.cpl"); hinstResources = TaLocale_LoadCorrespondingModule (hinst); strcpy(szAppName, LoadResString(IDS_APP_NAME)); sprintf(szAppPath, "%s%s", GetInstallDir(), APP_EXE_PATH); return (hinst != 0); case CPL_GETCOUNT: /* second message, sent once */ return 1; break; case CPL_NEWINQUIRE: /* third message, sent once per app */ lpNewCPlInfo = (LPNEWCPLINFO) lParam2; lpNewCPlInfo->dwSize = (DWORD) sizeof(NEWCPLINFO); lpNewCPlInfo->dwFlags = 0; lpNewCPlInfo->dwHelpContext = 0; lpNewCPlInfo->lData = 0; hIcon = TaLocale_LoadIcon(IDI_AFSD); if (hIcon == 0) MessageBox(0, LoadResString(IDS_ERROR_LOADING_ICON), szAppName, MB_ICONEXCLAMATION); lpNewCPlInfo->hIcon = hIcon; lpNewCPlInfo->szHelpFile[0] = '\0'; strcpy(lpNewCPlInfo->szName, szAppName); strcpy(lpNewCPlInfo->szInfo, LoadResString(IDS_CPA_TITLE)); break; case CPL_SELECT: /* applet icon selected */ break; case CPL_DBLCLK: /* applet icon double-clicked */ if (WinExec(szAppPath, SW_SHOW) < 32) MessageBox(0, LoadResString(IDS_EXECUTION_ERROR), szAppName, MB_ICONSTOP); break; case CPL_STOP: /* sent once per app. before CPL_EXIT */ break; case CPL_EXIT: /* sent once before FreeLibrary called */ if (hinstResources) FreeLibrary (hinstResources); break; default: break; } return 0; }
BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow) { TaLocale_LoadCorrespondingModule (hInst); memset (&g, 0x00, sizeof(g)); g.hInst = hInst; g.hAccel = TaLocale_LoadAccelerators (ACCEL_MAIN); HWND hPrevious; TCHAR szTitle[ cchRESOURCE ]; GetString (szTitle, IDS_APP_TITLE); if ((hPrevious = FindWindow (TEXT("AFSManagerClass"), szTitle)) != NULL) { SetFocus (hPrevious); SendMessage (hPrevious, WM_SHOW_YOURSELF, 0, 0); return FALSE; } AfsAppLib_SetAppName(szTitle); AfsAppLib_SetPumpRoutine(PumpMessage); TASKQUEUE_PARAMS tqp; memset (&tqp, 0x00, sizeof(tqp)); tqp.nThreadsMax = 10; tqp.fnCreateTaskPacket = CreateTaskPacket; tqp.fnPerformTask = PerformTask; tqp.fnFreeTaskPacket = FreeTaskPacket; AfsAppLib_InitTaskQueue (&tqp); Main_ConfigureHelp(); // Determine how the app is supposed to look--that is, remember what it // looked like last time, and if there was no "last time", pick some // decent defaults. // if (!RestoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED)) { memset (&gr, 0x00, sizeof(gr)); SetRectEmpty (&gr.rMain); SetRectEmpty (&gr.rMainPreview); SetRectEmpty (&gr.rServerLast); SetRectEmpty (&gr.rViewLog); SetRectEmpty (&gr.rActions); gr.fPreview = TRUE; gr.fVert = TRUE; gr.fActions = FALSE; gr.tabLast = tabFILESETS; Server_SetDefaultView_Horz (&gr.diHorz.viewSvr); Server_SetDefaultView_Vert (&gr.diVert.viewSvr); Services_SetDefaultView (&gr.viewSvc); Aggregates_SetDefaultView (&gr.viewAgg); Filesets_SetDefaultView (&gr.viewSet); Replicas_SetDefaultView (&gr.viewRep); Action_SetDefaultView (&gr.viewAct); Server_Key_SetDefaultView (&gr.viewKey); gr.diHorz.cSplitter = -100; gr.diVert.cSplitter = -89; gr.cbQuotaUnits = cb1KB; gr.fOpenMonitors = TRUE; gr.fCloseUnmonitors = TRUE; gr.fServerLongNames = FALSE; gr.fDoubleClickOpens = 2; gr.fWarnBadCreds = TRUE; gr.ivSvr = ivSTATUS; gr.ivAgg = ivSTATUS; gr.ivSet = ivSTATUS; gr.ivSvc = ivSTATUS; } ULONG status; if (!AfsClass_Initialize (&status)) { if (status == ADMCLIENTCANTINITAFSLOCATION) ImmediateErrorDialog (status, IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL); else ImmediateErrorDialog (status, IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN); return FALSE; } AfsClass_RequestLongServerNames (gr.fServerLongNames); AfsClass_SpecifyRefreshDomain (AFSCLASS_WANT_VOLUMES); // Create a notification object for the AFSClass library, so that it can // let us know when anything changes. The notification handler we'll // install will take requests from the rest of the SVRMGR package and // forward notifications around to whichever windows are actually // interested. // CreateNotificationDispatch(); // Create a few variations on WC_DIALOG, so we get appropriate icons on // our windows. // WNDCLASS wc; GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc); wc.hInstance = THIS_HINST; wc.hIcon = TaLocale_LoadIcon (IDI_MAIN); wc.lpszClassName = TEXT("AFSManagerClass"); wc.style |= CS_GLOBALCLASS; RegisterClass (&wc); GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc); wc.hInstance = THIS_HINST; wc.hIcon = TaLocale_LoadIcon (IDI_SERVER); wc.lpszClassName = TEXT("ServerWindowClass"); wc.style |= CS_GLOBALCLASS; RegisterClass (&wc); // Okay, the big step: create the main window (ie, the servers list). // Note that it doesn't get shown yet! // CMDLINEOP op = ParseCommandLine (pszCmdLine); if (op == opCLOSEAPP) return FALSE; if (op == opLOOKUPERRORCODE) { Help_FindError(); return FALSE; } g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DialogProc); if (g.hMain == NULL) return FALSE; if (op != opNOCELLDIALOG) { if (OpenCellDialog() != IDOK) return FALSE; } return TRUE; }
extern "C" LONG APIENTRY CPlApplet(HWND hwndCPl, UINT uMsg, LONG lParam1, LONG lParam2) { LPNEWCPLINFO lpNewCPlInfo; LPCPLINFO lpCPlInfo; SHELLEXECUTEINFO shellExecInfo; switch (uMsg) { case CPL_INIT: /* first message, sent once */ hinst = GetModuleHandle("afs_cpa.cpl"); hinstResources = TaLocale_LoadCorrespondingModule (hinst); CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); return (hinst != 0); case CPL_GETCOUNT: /* second message, sent once */ return 1; case CPL_INQUIRE: /* in case we receive this we should indicate that we like NEWINQUIRE better. */ lpCPlInfo = (CPLINFO *) lParam2; lpCPlInfo->idIcon = ((IsClientInstalled() || !IsWindowsNT())? IDI_AFSD : IDI_CCENTER); lpCPlInfo->idName = CPL_DYNAMIC_RES; lpCPlInfo->idInfo = CPL_DYNAMIC_RES; lpCPlInfo->lData = 0; break; case CPL_NEWINQUIRE: /* third message, sent once per app */ lpNewCPlInfo = (LPNEWCPLINFO) lParam2; lpNewCPlInfo->dwSize = (DWORD) sizeof(NEWCPLINFO); lpNewCPlInfo->dwFlags = 0; lpNewCPlInfo->dwHelpContext = 0; lpNewCPlInfo->lData = 0; if (IsClientInstalled() || !IsWindowsNT()) lpNewCPlInfo->hIcon = TaLocale_LoadIcon(IDI_AFSD); else lpNewCPlInfo->hIcon = TaLocale_LoadIcon(IDI_CCENTER); lpNewCPlInfo->szHelpFile[0] = '\0'; GetString (lpNewCPlInfo->szName, (!IsWindowsNT()) ? IDS_CPL_NAME_95 : (!IsClientInstalled()) ? IDS_CPL_NAME_CCENTER : IDS_CPL_NAME_NT); GetString (lpNewCPlInfo->szInfo, (!IsWindowsNT()) ? IDS_CPL_DESC_95 : (!IsClientInstalled()) ? IDS_CPL_DESC_CCENTER : IDS_CPL_DESC_NT); break; case CPL_DBLCLK: /* applet icon double-clicked */ memset(&shellExecInfo, 0, sizeof(shellExecInfo)); shellExecInfo.cbSize = sizeof(shellExecInfo); shellExecInfo.nShow = SW_SHOWNORMAL; shellExecInfo.hwnd = hwndCPl; shellExecInfo.lpFile = "afs_config.exe"; if (!IsClientInstalled() && IsWindowsNT()) shellExecInfo.lpParameters = "/c"; ShellExecuteEx(&shellExecInfo); break; case CPL_EXIT: CoUninitialize(); if (hinstResources) FreeLibrary (hinstResources); break; } return 0; }