|
|
1.1 ! root 1: ! 2: /******************************************************************************\ ! 3: * This is a part of the Microsoft Source Code Samples. ! 4: * Copyright (C) 1993 Microsoft Corporation. ! 5: * All rights reserved. ! 6: * This source code is only intended as a supplement to ! 7: * Microsoft Development Tools and/or WinHelp documentation. ! 8: * See these sources for detailed information regarding the ! 9: * Microsoft samples programs. ! 10: \******************************************************************************/ ! 11: ! 12: /* ! 13: ddemain.c ! 14: */ ! 15: ! 16: #include <windows.h> ! 17: #include <stdio.h> ! 18: #include <stdlib.h> ! 19: #include <string.h> ! 20: ! 21: #include "ddeinst.h" ! 22: #include "ddeglbl.h" ! 23: ! 24: ! 25: HMENU hMenu; ! 26: ! 27: /******************************************************************** ! 28: ! 29: WinMain. ! 30: ! 31: Function that starts the app. ! 32: ! 33: ********************************************************************/ ! 34: ! 35: int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, ! 36: LPSTR lpCmdLine, int iShowCmd) { ! 37: MSG msg; ! 38: ! 39: ghModule = GetModuleHandle (NULL); ! 40: ! 41: ! 42: // Initialize the Application ! 43: if (!InitializeApp ()) { ! 44: MessageBox (ghwndMain, "memory: InitializeApp failure!", "Error", MB_OK); ! 45: return (FALSE); ! 46: }/*endIf*/ ! 47: ! 48: ! 49: // Parse the command line ! 50: if (!DecodeOptions (lpCmdLine)) { ! 51: MessageBox (ghwndMain, "decode: Command line errors!", "Error", MB_OK); ! 52: CleanUpApp (); ! 53: return (FALSE); ! 54: }/*endIf*/ ! 55: ! 56: ! 57: // Load the accelerators ! 58: if (!(ghAccel = LoadAccelerators (ghModule, MAKEINTRESOURCE(ACCEL_ID)))) { ! 59: MessageBox(ghwndMain, "memory: Load Accel failure!", "Error", MB_OK); ! 60: }/*endIf*/ ! 61: ! 62: ! 63: // Test ! 64: PostMessage (ghwndMain, WM_USER_GET_APPS, 0, 0L); ! 65: ! 66: // Get the group names from the Program Manager ! 67: PostMessage (ghwndMain, WM_USER_GET_GROUPS, 0, 0L); ! 68: ! 69: // Main Event Loop ! 70: while (GetMessage (&msg, NULL, 0, 0)) { ! 71: if (!TranslateAccelerator (ghwndMain, ghAccel, &msg)) { ! 72: TranslateMessage (&msg); ! 73: DispatchMessage (&msg); ! 74: }/*endIf*/ ! 75: }/*endWhile*/ ! 76: ! 77: // Clean up ! 78: CleanUpApp (); ! 79: return (TRUE); ! 80: }/* end WinMain */ ! 81: ! 82: /******************************************************************** ! 83: ! 84: InitializeApp. ! 85: ! 86: Function that registers the window classes and creates the main ! 87: window. ! 88: ! 89: ********************************************************************/ ! 90: ! 91: BOOL InitializeApp () { ! 92: char szErrorString[80]; ! 93: WNDCLASS wc; ! 94: long lError; ! 95: ! 96: // Fill in the class info for the main window. ! 97: wc.style = CS_OWNDC; ! 98: wc.lpfnWndProc = (WNDPROC)MainWndProc; ! 99: wc.cbClsExtra = 0; ! 100: wc.cbWndExtra = sizeof(LONG); ! 101: wc.hInstance = ghModule; ! 102: wc.hIcon = LoadIcon(ghModule, MAKEINTRESOURCE(APPICON)); ! 103: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 104: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); ! 105: wc.lpszMenuName = "MainMenu"; ! 106: wc.lpszClassName = "DDEMLInstaller"; ! 107: ! 108: if (!RegisterClass(&wc)) ! 109: return FALSE; ! 110: ! 111: // Fill in the class info for the status bar. ! 112: wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; ! 113: wc.lpfnWndProc = (WNDPROC)StatusBarWndProc; ! 114: wc.hIcon = NULL; ! 115: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 116: wc.hbrBackground = (HBRUSH)(COLOR_BTNSHADOW); ! 117: wc.lpszMenuName = NULL; ! 118: wc.lpszClassName = "StatusBar"; ! 119: ! 120: if (!RegisterClass(&wc)) ! 121: return FALSE; ! 122: ! 123: hMenu = LoadMenu (ghModule, MAKEINTRESOURCE (MainMenu)); ! 124: if (!hMenu) { ! 125: lError = GetLastError (); ! 126: sprintf (szErrorString, "MainMenu load failed %ld", lError); ! 127: MessageBox (GetDesktopWindow (), szErrorString, "Error", MB_OK); ! 128: }/*endIf*/ ! 129: ! 130: ghwndMain = CreateWindowEx (0L, "DDEMLInstaller", "Sample Installer", ! 131: WS_OVERLAPPED | WS_CAPTION | WS_BORDER | ! 132: WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | ! 133: WS_CLIPCHILDREN | WS_SYSMENU, ! 134: 80, 70, 550, 250, ! 135: NULL, hMenu, ghModule, NULL); ! 136: ! 137: if (ghwndMain == NULL) ! 138: return FALSE; ! 139: ! 140: ShowWindow (ghwndMain, SW_SHOWDEFAULT); ! 141: UpdateWindow (ghwndMain); ! 142: ! 143: SetWindowLong (ghwndMain, GWL_USERDATA, 0L); ! 144: ! 145: // Set the initial focus to the main window ! 146: SetFocus(ghwndMain); /* set initial focus */ ! 147: ! 148: return TRUE; ! 149: }/* end InitializeApp */ ! 150: ! 151: /******************************************************************** ! 152: ! 153: CleanUpApp. ! 154: ! 155: Function that takes care of house cleaning when app terminates. ! 156: ! 157: ********************************************************************/ ! 158: ! 159: void CleanUpApp () { ! 160: ! 161: // Destroy the menu loaded in InitializeApp. ! 162: DestroyMenu (hMenu); ! 163: ! 164: // If the DDEML conversation id is non-zero the Uninitialize the conversation ! 165: if (lIdInst2) { ! 166: DdeUninitialize (lIdInst2); ! 167: }/*endIf*/ ! 168: ! 169: // If memory has been allocated for the user defined path then release it. ! 170: if (szUserPath) { ! 171: VirtualFree (szUserPath, MAX_PATH, MEM_DECOMMIT); ! 172: }/*endIf*/ ! 173: if (szUserGroup) { ! 174: VirtualFree (szUserGroup, MAX_PATH, MEM_DECOMMIT); ! 175: }/*endIf*/ ! 176: }/* end CleanUpApp */ ! 177: ! 178: /******************************************************************** ! 179: ! 180: DecodeOptions. ! 181: ! 182: Function that decodes the command line looking for the user specified ! 183: arguments. ! 184: ! 185: ********************************************************************/ ! 186: ! 187: BOOL DecodeOptions (LPSTR lpCmdLine) { ! 188: LPSTR szFirst; ! 189: LPSTR szToken; ! 190: ! 191: // Allocate a block of memory to use for the user specified path. ! 192: szUserPath = VirtualAlloc (NULL, MAX_PATH, MEM_COMMIT, PAGE_READWRITE); ! 193: szUserGroup = VirtualAlloc (NULL, MAX_PATH, MEM_COMMIT, PAGE_READWRITE); ! 194: if (!GetEnvironmentVariable ("MSTOOLS", szUserPath, MAX_PATH - 1)) { ! 195: strcpy (szUserPath, "c:\\mstools\\samples"); ! 196: } else { ! 197: strcat (szUserPath, "\\samples"); ! 198: }/*endIf*/ ! 199: strcpy (szUserGroup, "Sample Applications"); ! 200: fBatch = FALSE; ! 201: if (!(szToken = strtok (lpCmdLine, "-/"))) { ! 202: return (TRUE); ! 203: }/*endIf*/ ! 204: do { ! 205: switch (*szToken) { ! 206: case 's': ! 207: case 'S':{ ! 208: szFirst = szToken + 1; ! 209: while (*szFirst == ' ') { ! 210: szFirst++; ! 211: }/*endWhile*/ ! 212: strcpy (szUserPath, szFirst); ! 213: while (szFirst = strrchr (szUserPath, ' ')) { ! 214: *szFirst = '\0'; ! 215: }/*endWhile*/ ! 216: break; ! 217: }/*endCase*/ ! 218: case 'b': ! 219: case 'B': { ! 220: fBatch = TRUE; ! 221: break; ! 222: }/*endCase*/ ! 223: case 'i': ! 224: case 'I': { ! 225: fBatch = FALSE; ! 226: break; ! 227: }/*endCase*/ ! 228: case 'g': ! 229: case 'G': { ! 230: szFirst = szToken + 1; ! 231: while (*szFirst == ' ') szFirst++; ! 232: strcpy (szUserGroup, szFirst); ! 233: while (szFirst = strrchr (szUserGroup, ' ')) { ! 234: *szFirst = '\0'; ! 235: }/*endWhile*/ ! 236: break; ! 237: }/*endCase*/ ! 238: }/*endSwitch*/ ! 239: } while (szToken = strtok (NULL, "-/")); ! 240: return (TRUE); ! 241: }/* end DecodeOptions */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.