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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * INIT.C
  3.  *
  4.  * Application (not OLE) specific initialization code.
  5.  *  FApplicationInit
  6.  *  FFileInit
  7.  *  HLoadAppStrings
  8.  *  HListParse
  9.  *  PszWhiteSpaceScan
  10.  *
  11.  * FApplicationInit makes some calls into OLEINST.C and OLEINIT.C
  12.  *
  13.  * Copyright(c) Microsoft Corp. 1992-1994 All Rights Reserved
  14.  * Win32 version, January 1994
  15.  */
  16. #include <windows.h>
  17. #include <ole.h>
  18. #include "cosmo.h"
  19. #include "oleinst.h"
  20. #include "oleglobl.h"
  21. /*
  22.  * FApplicationInit
  23.  *
  24.  * Purpose:
  25.  *  All application specific initialization including loading
  26.  *  the stringtable, registering window classes, and calling any
  27.  *  OLE specific initialziation code.
  28.  *
  29.  * Parameters:
  30.  *  pGlob           LPGLOBALS to global variable block.
  31.  *  hPrevInst       HINSTANCE to the previous application instance, if any.
  32.  *
  33.  * Return Value:
  34.  *  BOOL            TRUE if everything succeeds, FALSE otherwise.
  35.  *                  If FALSE is returned, allocated memory and objects
  36.  *                  are not necessarily freed.  The caller should then
  37.  *                  use the FApplicationExit function to perform cleanup.
  38.  */
  39. BOOL WINAPI FApplicationInit(LPGLOBALS pGlob, HINSTANCE hPrevInst)
  40.     {
  41.     HLOCAL      hMem;
  42.     LPSTR FAR * ppszCmds;
  43.     LPSTR FAR * ppszT;
  44.     BOOL        fRet=TRUE;
  45. #ifdef MAKEOLESERVER
  46.     //Make sure this is NULLed in case we fail
  47.     pOLE->pSvr=NULL;
  48. #endif
  49.     /*
  50.      * InitApp allocates local memory for strings. WinMain must free.
  51.      * If this fails, we should quit BEFORE we register any classes
  52.      * or do anything else to suck up USER or GDI resources.
  53.      */
  54.     hMem=HLoadAppStrings(pGlob);
  55.     if (NULL==hMem)
  56.         return FALSE;
  57.     pGlob->hStringMem=hMem;
  58.     //Classes are only registered if hPrevInstance is NULL.
  59.     if (!FClassRegister(pGlob, hPrevInst))
  60.         {
  61.         LocalFree(pGlob->hStringMem);
  62.         return FALSE;
  63.         }
  64.     //Register a private clipboard format, same as the class name.
  65.     pGlob->cfCosmo=RegisterClipboardFormat(rgpsz[IDS_CLASSCOSMO]);
  66.     hMem=HListParse(pGlob->pszCmdLine);
  67.     ppszCmds=(LPSTR FAR *)(PSTR)hMem;
  68.     ppszT=ppszCmds;
  69.     /*
  70.      * Scan the command line list for the first thing without a
  71.      * / or - which is out initial file.
  72.      */
  73.     while (*ppszT)
  74.         {
  75.         if ('-'!=**ppszT && '/'!=**ppszT)
  76.             break;
  77.         ppszT++;
  78.         }
  79.     //Copy this filename for later loading during WM_CREATE.
  80.     if (NULL==*ppszT)
  81.         pGlob->szFile[0]=0;
  82.     else
  83.         lstrcpy(pGlob->szFile, *ppszT);
  84. #ifdef MAKEOLESERVER
  85.     /*
  86.      * Go do anything that deals with the registration database.
  87.      * Installation could be moved to an installation program
  88.      */
  89.     if (!FRegDBInstall())
  90.         {
  91.         LocalFree(hMem);
  92.         return FALSE;
  93.         }
  94.     //Initialize OLE specific data.  FOLEInstanceInit affects pGlob->fOLE
  95.     if (FOLEInstanceInit(pOLE, pGlob->hInst, rgpsz[IDS_CLASSCOSMO]
  96.         , ppszCmds, pGlob->nCmdShow))
  97.         {
  98.         //We will open any linked file later in WM_CREATE.
  99.         //Copy the new ShowWindow parameter.
  100.         pGlob->nCmdShow=pOLE->pSvr->nCmdShow;
  101.         }
  102.     else
  103.         fRet=FALSE;
  104. #endif //MAKEOLESERVER
  105.     //Free the command-line string list in hMem.
  106.     LocalFree(hMem);
  107.     return fRet;
  108.     }
  109. /*
  110.  * FClassRegister
  111.  *
  112.  * Purpose:
  113.  *  Registers classes used by the application:  "Cosmo" the main
  114.  *  window, and "Polyline" the editing window.
  115.  *
  116.  * Parameters:
  117.  *  pGlob           LPGLOBALS to the global variables block.
  118.  *  hPrevInst       HINSTANCE of any previous application instance.
  119.  *
  120.  * Return Value:
  121.  *  BOOL            TRUE if all classes are successfully registered
  122.  *                  (or if hPrevInstance is non-NULL).  FALSE is
  123.  *                  any registration fails.
  124.  *
  125.  */
  126. BOOL WINAPI FClassRegister(LPGLOBALS pGlob, HINSTANCE hPrevInst)
  127.     {
  128.     WNDCLASS        wc;
  129.     if (hPrevInst)
  130.         return TRUE;
  131.     /*
  132.      * Note that we do not need to unregister classes on a failure
  133.      * since that's part of automatic app cleanup.
  134.      */
  135.     wc.style         = CS_HREDRAW | CS_VREDRAW;
  136.     wc.lpfnWndProc   = CosmoWndProc;
  137.     wc.cbClsExtra    = 0;
  138.     wc.cbWndExtra    = 0;
  139.     wc.hInstance     = pGlob->hInst;
  140.     wc.hIcon         = LoadIcon(pGlob->hInst, "Icon");
  141.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  142.     wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);
  143.     wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU);
  144.     wc.lpszClassName = rgpsz[IDS_CLASSCOSMO];
  145.     if (!RegisterClass(&wc))
  146.         return FALSE;
  147.     wc.style         = CS_HREDRAW | CS_VREDRAW;
  148.     wc.lpfnWndProc   = PolylineWndProc;
  149.     wc.cbClsExtra    = 0;
  150.     wc.cbWndExtra    = CBPOLYLINEWNDEXTRA;
  151.     wc.hInstance     = pGlob->hInst;
  152.     wc.hIcon         = NULL;
  153.     wc.hCursor       = LoadCursor(NULL, IDC_CROSS);
  154.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  155.     wc.lpszMenuName  = NULL;
  156.     wc.lpszClassName = rgpsz[IDS_CLASSPOLYLINE];
  157.     if (!RegisterClass(&wc))
  158.         return FALSE;
  159.     return TRUE;
  160.     }
  161. /*
  162.  * FFileInit
  163.  *
  164.  * Purpose:
  165.  *  Loads a file specified on the command line and sets the polyline
  166.  *  window data to reflect the contents of that file.  This is set
  167.  *  in a different function instead of in FApplicationInit since
  168.  *  it depends on the Polyline window being created which has not
  169.  *  happened by FApplicationInit time.
  170.  *
  171.  * Parameters:
  172.  *  pGlob           LPGLOBALS to global variable block.
  173.  *
  174.  * Return Value:
  175.  *  BOOL            TRUE if everything succeeded, FALSE otherwise.
  176.  *
  177.  */
  178. BOOL WINAPI FFileInit(LPGLOBALS pGlob)
  179.     {
  180.     POLYLINE        pl;
  181.     /*
  182.      * If there is a file to load, then load it and change the
  183.      * window title.  If loading fails, then default to a new
  184.      * untitled document.
  185.      */
  186.     if (0!=pGlob->szFile[0])
  187.         {
  188.         if (!FCosFileRead(pGlob, pGlob->szFile, &pl))
  189.             {
  190.             //If we're in OLE linking mode, return unsuccessful
  191.             if (pGlob->fOLE)
  192.                 return FALSE;
  193.             pGlob->szFile[0]=0;
  194.             WindowTitleSet(pGlob->hWnd, rgpsz[IDS_UNTITLED]);
  195.             pGlob->fOpenFile=FALSE;
  196.             }
  197.         else
  198.             {
  199.             SendMessage(pGlob->hWndPolyline, PLM_POLYLINESET, TRUE,
  200.                         (LONG)(LPSTR)&pl);
  201.             WindowTitleSet(pGlob->hWnd, pGlob->szFile);
  202.             pGlob->fOpenFile=TRUE;
  203.             }
  204.         }
  205.     return TRUE;
  206.     }
  207. /*
  208.  * HLoadAppStrings
  209.  *
  210.  * Purpose:
  211.  *  Allocates FIXED local memory and reads the applications
  212.  *  string resources into that memory.  Each string's pointer
  213.  *  is available with rgpsz[i] where i is the ID value of the
  214.  *  string.  The strings must have sequential IDs.
  215.  *
  216.  * Parameters:
  217.  *  pGlob           LPGLOBALS to global variable block.
  218.  *
  219.  * Return Value:
  220.  *  HLOCAL          Handle to the local memory.  NULL if memory could
  221.  *                  not be allocated.
  222.  */
  223. HLOCAL WINAPI HLoadAppStrings(LPGLOBALS pGlob)
  224.     {
  225.     HLOCAL      hLocalMem;
  226.     char NEAR   *pch;
  227.     UINT        cchUsed=0;
  228.     UINT        cch;
  229.     short       i;
  230.     /*
  231.      * Allocate memory and load strings.  NOTE!  The LPTR style
  232.      * specifies FIXED memory.  This should not be a big deal
  233.      * since this is an early allocation into the local heap.
  234.      * But it should be watched if the number of strings becomes
  235.      * large.
  236.      */
  237.     hLocalMem=LocalAlloc(LPTR, CSTRINGS*CCHSTRINGMAX);
  238.     if (hLocalMem==NULL)
  239.         return (HLOCAL)NULL;
  240.     /*
  241.      * This operation is only valid for FIXED memory.  Otherwise use
  242.      * LocalLock.
  243.      */
  244.     pch=(char *)hLocalMem;
  245.     /*
  246.      * Load the strings into the memory and retain the specific
  247.      * pointer to that string.
  248.      */
  249.     for (i=0; i<CSTRINGS; i++)
  250.         {
  251.         cch=LoadString(pGlob->hInst, i, (LPSTR)(pch+cchUsed), CCHSTRINGMAX-1);
  252.         rgpsz[i]=(char *)(pch+cchUsed);
  253.         /*
  254.          * One is added to cch to include a NULL.  The memory was ZEROINITed
  255.          * on allocation so by skipping a byte we get the NULL.
  256.          */
  257.         cchUsed +=cch+1;
  258.         }
  259.     /*
  260.      * We are assuming that no string is over CCHSTRINGMAX, and therefore
  261.      * we did not use all the allocated memory.  Therefore LocalReAlloc
  262.      * will only SHRINK the block, never expand it.  So if it fails, we
  263.      * don't care--all the strings are still there, we just wasted some
  264.      * space.
  265.      */
  266.     LocalReAlloc(hLocalMem, cchUsed+1, LPTR);
  267.     return hLocalMem;
  268.     }
  269. /*
  270.  * HListParse
  271.  *
  272.  * Purpose:
  273.  *  Parses any string containing text separated by whitespace into
  274.  *  a list of pointers into that string as well as overwriting the
  275.  *  whitespace with null terminators.  The result is that each
  276.  *  pointer in the list points to its own null-terminated string,
  277.  *  but those strings are not necessarily contiguous.
  278.  *
  279.  *  Since MS-DOS command lines are limited to 128 characters, this
  280.  *  function limits the number of arguments to 64 separate strings.
  281.  *
  282.  * Parameters:
  283.  *  psz             LPSTR to the string to parse.
  284.  *
  285.  * Return Value:
  286.  *  HLOCAL          Local LMEM_FIXED memory handle containing the
  287.  *                  list of LPSTRs to the list items.  NULL if memory
  288.  *                  could not be allocated.
  289.  */
  290. HLOCAL WINAPI HListParse(LPSTR psz)
  291.     {
  292.     HLOCAL       hMem;
  293.     LPSTR FAR   *ppsz;
  294.     LPSTR        pszT;
  295.     UINT         cp;
  296.     //Allocate space for 64 pointers.
  297.     hMem=LocalAlloc(LPTR, 64*sizeof(LPSTR));
  298.     if (NULL==hMem)
  299.         return NULL;
  300.     ppsz=(LPSTR FAR *)(PSTR)hMem;
  301.     cp=0;
  302.     /*
  303.      * For each string, scan for whitespace, save that pointer in
  304.      * ppsz, and null-terminate that string.  If it was already
  305.      * null-terminated, then there are no more pieces in the list.
  306.      */
  307.     while (0!=*psz)
  308.         {
  309.         //Skip to beginning of first item.
  310.         psz=PszWhiteSpaceScan(psz, TRUE);
  311.         //If it's a zero, stop here.
  312.         if (0==*psz)
  313.             break;
  314.         //Find the end of this item.
  315.         pszT=PszWhiteSpaceScan(psz, FALSE);
  316.         //Null terminate this string and point to next character.
  317.         if (0!=*pszT)
  318.             *pszT++=0;
  319.         //Save this string pointer.
  320.         *ppsz++=psz;
  321.         cp++;
  322.         //Check our limit of 64.
  323.         if (64 <= cp)
  324.             break;
  325.         //Check next item.
  326.         psz=pszT;
  327.         }
  328.     return hMem;
  329.     }
  330. /*
  331.  * PszWhiteSpaceScan
  332.  *
  333.  * Purpose:
  334.  *  Skips characters in a string until a whitespace or non-whitespace
  335.  *  character is seen.  Whitespace is defined as n, r, t, or ' '.
  336.  *
  337.  * NOTE:  This function is not extremely well suited to localization.
  338.  *        It assumes that an existing application seeking to become
  339.  *        and OLE server probably already has such a string function
  340.  *        available.
  341.  *
  342.  * Parameters:
  343.  *  psz             LPSTR to string to manipulate
  344.  *  fSkip           BOOL  TRUE if we want to skip whitespace.
  345.  *                  FALSE if we want to skip anything but whitespace.
  346.  *
  347.  * Return Value:
  348.  *  LPSTR           Pointer to first character in the string that either
  349.  *                  non-whitespace (fSkip=TRUE) or whitespace (fSkip=FALSE),
  350.  *                  which may be the null terminator.
  351.  */
  352. LPSTR PASCAL PszWhiteSpaceScan(LPSTR psz, BOOL fSkip)
  353.     {
  354.     char        ch;
  355.     BOOL        fWhite;
  356.     while (ch=*psz)
  357.         {
  358.         fWhite=('n'==ch || 'r'==ch || 't'==ch || ' '==ch);
  359.         //Too bad C doesn't have a logical XOR (^^) operator.
  360.         if ((fSkip && !fWhite) || (!fSkip && fWhite))
  361.             break;
  362.         psz++;
  363.         }
  364.     return psz;
  365.     }