home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winbase / ipc / ddeml / ddeinst / ddemain.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  7KB  |  242 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1993-1997 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 */
  242.