DDEMAIN.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

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