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

Windows编程

开发平台:

Visual C++

  1. /**************************************************************************
  2.    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3.    ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4.    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5.    PARTICULAR PURPOSE.
  6.    Copyright 1997 Microsoft Corporation.  All Rights Reserved.
  7. **************************************************************************/
  8. /**************************************************************************
  9.    File:          Utils.cpp
  10.    
  11.    Description:   Contains utility routines for the DOServer sample.
  12. **************************************************************************/
  13. /**************************************************************************
  14.    #include statements
  15. **************************************************************************/
  16. #include <windows.h>
  17. #include "utils.h"
  18. /**************************************************************************
  19.    ParseCommandLine()
  20.    
  21.    Parses the Windows command line which was passed to WinMain.
  22.    This function determines if the -Embedding switch has been given.
  23. **************************************************************************/
  24. STDAPI_(void) ParseCommandLine(LPSTR pszCommandLine, LPBOOL pfEmbedFlag, LPTSTR pszFileName)
  25. {
  26. int      i;
  27. TCHAR    szCmdLine[MAX_PATH];
  28. LPTSTR   pszCmdLine = szCmdLine;
  29. TCHAR    szBuf[MAX_PATH];
  30. if(!pszCommandLine)
  31.    return;
  32.    
  33. if(!pfEmbedFlag)
  34.    return;
  35.    
  36. *pfEmbedFlag = FALSE;
  37. #ifdef UNICODE
  38. MultiByteToWideChar( CP_ACP, 
  39.                      MB_PRECOMPOSED, 
  40.                      pszCommandLine, 
  41.                      -1, 
  42.                      pszCmdLine,
  43.                      ARRAYSIZE(szCmdLine));
  44. #else
  45. lstrcpy(pszCmdLine, pszCommandLine);
  46. #endif
  47. // skip blanks
  48. while(isspace(*pszCmdLine)) 
  49.    pszCmdLine++;
  50. // No filename or options, so start a fresh document.
  51. if(!*pszCmdLine)   
  52.    return;
  53. // Check for "-Embedding" or "/Embedding" and set fEmbedding.
  54. if((*pszCmdLine == '-') || (*pszCmdLine == '/'))
  55.    {
  56.    pszCmdLine++;
  57.    pszCmdLine = GetWord(pszCmdLine, szBuf);
  58.    *pfEmbedFlag = !lstrcmp(szBuf, EMBEDDINGFLAG);
  59.    }
  60. if(!pszFileName)
  61.    return;
  62.    
  63. *pszFileName = 0;
  64. // skip blanks
  65. while(isspace(*pszCmdLine)) 
  66.    pszCmdLine++;
  67. // set pszFileName to argument
  68. for(i = 0; *(pszCmdLine + i); i++) 
  69.    {
  70.    *(pszFileName + i) = *(pszCmdLine + i);
  71.    }
  72. *(pszFileName + i) = 0;
  73. }
  74. /**************************************************************************
  75.    GetWord()
  76.    
  77.    LPSTR lpszSrc - Pointer to a source string
  78.    LPSTR lpszDst - Pointer to destination buffer
  79.    Will copy one space-terminated or null-terminated word from the source
  80.    string to the destination buffer.
  81.    
  82.    returns: pointer to next character following the word.
  83. **************************************************************************/
  84. static LPTSTR GetWord(LPTSTR lpszSrc, LPTSTR lpszDst)
  85. {
  86. while (*lpszSrc && !isspace(*lpszSrc))
  87.    *lpszDst++ = *lpszSrc++;
  88. *lpszDst = '';
  89. return lpszSrc;
  90. }
  91. /* GetOleObjectDataHere
  92. ** ----------------------
  93. **    Render CF_EMBEDSOURCE/CF_EMBEDDEDOBJECT data on an TYMED_ISTORAGE
  94. **    medium by asking the object to save into the storage.
  95. **    the object must support IPersistStorage.
  96. **
  97. **    if lpMedium->tymed == TYMED_NULL, then a delete-on-release
  98. **    storage is allocated (either file-based or memory-base depending
  99. **    the value of fUseMemory). this is useful to support an
  100. **    IDataObject::GetData call where the callee must allocate the
  101. **    medium.
  102. **
  103. **    if lpMedium->tymed == TYMED_ISTORAGE, then the data is writen
  104. **    into the passed in IStorage. this is useful to support an
  105. **    IDataObject::GetDataHere call where the caller has allocated his
  106. **    own IStorage.
  107. */
  108. STDAPI GetOleObjectDataHere(  LPPERSISTSTORAGE lpPStg,
  109.                               LPFORMATETC lpformatetc,
  110.                               LPSTGMEDIUM lpMedium)
  111. {
  112. LPSTORAGE   lpstg = NULL;
  113. DWORD       reserved = 0;
  114. HRESULT     hr = DATA_E_FORMATETC;
  115. lpMedium->pUnkForRelease = NULL;
  116. if(lpMedium->tymed != TYMED_ISTORAGE) 
  117.    {
  118.    return hr;
  119.    }
  120. //AddRef the IStorage pointer
  121. lpPStg->AddRef();
  122. // NOTE: even if OleSave returns an error you should still call
  123. // SaveCompleted.
  124. hr = OleSave(lpPStg, lpMedium->pstg, FALSE /* fSameAsLoad */);
  125. lpPStg->SaveCompleted(NULL);
  126. return hr;
  127. }