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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * ANSI.CPP
  3.  *
  4.  * Utility functions for dealing with OLE APIs that need
  5.  * Unicode strings.  These are only defined when UNICODE
  6.  * is not defined, otherwise INOLE.H simply redefines them
  7.  * as macro pass-throughs to the original OLE functions.
  8.  *
  9.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  10.  *
  11.  * Kraig Brockschmidt, Microsoft
  12.  * Internet  :  kraigb@microsoft.com
  13.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  14.  */
  15. #define NOMACROREDIRECT
  16. #include "inoledll.h"
  17. #ifdef WIN32ANSI
  18. /*
  19.  * ConvertStringAlloc
  20.  *
  21.  * Purpose:
  22.  *  Allocates memory using the task allocator.  Used internally
  23.  *  in this file.
  24.  */
  25. HRESULT ConvertStringAlloc(ULONG ulSize, void **ppv)
  26.     {
  27.     HRESULT     hr;
  28.     IMalloc    *pIMalloc;
  29.     if (NULL==ppv)
  30.         return ResultFromScode(E_INVALIDARG);
  31.     hr=CoGetMalloc(MEMCTX_TASK, &pIMalloc);
  32.     if (FAILED(hr))
  33.         return hr;
  34.     *ppv=pIMalloc->Alloc(ulSize);
  35.     pIMalloc->Release();
  36.     return (NULL==*ppv) ? ResultFromScode(E_OUTOFMEMORY) : NOERROR;
  37.     }
  38. /*
  39.  * INOLE_ConvertStringToANSI
  40.  *
  41.  * Purpose:
  42.  *  Converts the string in pszW to ANSI, allocating the
  43.  *  output buffer pointed to by *ppszA on output.  The
  44.  *  string is allocated with COM's task allocator.
  45.  *
  46.  */
  47. STDAPI INOLE_ConvertStringToANSI(LPCWSTR pszW, LPSTR *ppszA)
  48.     {
  49.     ULONG   cch;
  50.     HRESULT hr;
  51.     //If input is NULL then just return the same
  52.     if (NULL==pszW)
  53.         {
  54.         *ppszA=NULL;
  55.         return NOERROR;
  56.         }
  57.     //This calculates the number of MBCS characters we'll need
  58.     cch=1+WideCharToMultiByte(CP_ACP, 0, pszW, -1, NULL, 0, NULL, NULL);
  59.     hr=ConvertStringAlloc(cch, (void **)ppszA);
  60.     if (FAILED(hr))
  61.         return hr;
  62.     WideCharToMultiByte(CP_ACP, 0, pszW, -1, *ppszA, cch, NULL, NULL);
  63.     return NOERROR;
  64.     }
  65. /*
  66.  * INOLE_StringFromCLSID
  67.  */
  68. STDAPI INOLE_StringFromCLSID(REFCLSID clsID, LPSTR *ppszCLSID)
  69.     {
  70.     LPWSTR  psz;
  71.     HRESULT hr;
  72.     if (NULL==ppszCLSID)
  73.         return ResultFromScode(E_INVALIDARG);
  74.     hr=StringFromCLSID(clsID, &psz);
  75.     if (FAILED(hr))
  76.         return hr;
  77.     hr=INOLE_ConvertStringToANSI(psz, ppszCLSID);
  78.     CoTaskMemFree((void *)psz);
  79.     return hr;
  80.     }
  81. /*
  82.  * INOLE_StringFromGUID2
  83.  */
  84. STDAPI INOLE_StringFromGUID2(REFGUID guid, LPSTR pszGUID, int cch)
  85.     {
  86.     LPSTR   psz;
  87.     HRESULT hr;
  88.     if (NULL==pszGUID)
  89.         return ResultFromScode(E_INVALIDARG);
  90.     hr=INOLE_StringFromCLSID(guid, &psz);
  91.     if (FAILED(hr))
  92.         return hr;
  93.     lstrcpyn(pszGUID, psz, cch);
  94.     CoTaskMemFree((void *)psz);
  95.     return hr;
  96.     }
  97. /*
  98.  * INOLE_ProgIDFromCLSID
  99.  */
  100. STDAPI INOLE_ProgIDFromCLSID(REFCLSID clsID, LPSTR *ppszProgID)
  101.     {
  102.     LPWSTR  psz;
  103.     HRESULT hr;
  104.     if (NULL==ppszProgID)
  105. return ResultFromScode(E_INVALIDARG);
  106.     hr=ProgIDFromCLSID(clsID, &psz);
  107.     if (FAILED(hr))
  108.         return hr;
  109.     hr=INOLE_ConvertStringToANSI(psz, ppszProgID);
  110.     CoTaskMemFree(psz);
  111.     return hr;
  112.     }
  113. /*
  114.  * INOLE_ReadFmtUserTypeStg
  115.  * INOLE_WriteFmtUserTypeStg
  116.  */
  117. STDAPI INOLE_ReadFmtUserTypeStg(IStorage *pIStorage
  118.     , CLIPFORMAT *pcf, LPSTR *ppszUserType)
  119.     {
  120.     HRESULT     hr;
  121.     LPOLESTR    pszUserType;
  122.     if (NULL==ppszUserType)
  123.         return ResultFromScode(E_INVALIDARG);
  124.     hr=ReadFmtUserTypeStg(pIStorage, pcf, &pszUserType);
  125.     if (FAILED(hr))
  126.         return hr;
  127.     if (ppszUserType)
  128.         {
  129.         hr=INOLE_ConvertStringToANSI(pszUserType, ppszUserType);
  130.         CoTaskMemFree(pszUserType);
  131.         }
  132.     return hr;
  133.     }
  134. STDAPI INOLE_WriteFmtUserTypeStg(IStorage *pIStorage, CLIPFORMAT cf
  135.     , LPSTR pszUserType)
  136.     {
  137.     OLECHAR     szType[512];
  138.     HRESULT     hr;
  139.     if (NULL==pszUserType)
  140.         return ResultFromScode(E_INVALIDARG);
  141.     MultiByteToWideChar(CP_ACP, 0, pszUserType, -1, szType, 512);
  142.     hr=WriteFmtUserTypeStg(pIStorage, cf, szType);
  143.     return hr;
  144.     }
  145. /*
  146.  * INOLE_StgIsStorageFile
  147.  * INOLE_StgCreateDocfile
  148.  * INOLE_StgOpenStorage
  149.  */
  150. STDAPI INOLE_StgIsStorageFile(LPCSTR pszName)
  151.     {
  152.     OLECHAR     szTemp[MAX_PATH];
  153.     MultiByteToWideChar(CP_ACP, 0, pszName, -1
  154.         , szTemp, MAX_PATH);
  155.     return StgIsStorageFile(szTemp);
  156.     }
  157. STDAPI INOLE_StgCreateDocfile(LPCSTR pszNameA, DWORD grfMode
  158.     , DWORD reserved, IStorage **ppIStorage)
  159.     {
  160.     OLECHAR     szTemp[MAX_PATH];
  161.     LPOLESTR    pszName;
  162.     *ppIStorage=NULL;
  163.     if (NULL!=pszNameA)
  164.         {
  165.         MultiByteToWideChar(CP_ACP, 0, pszNameA, -1
  166.             , szTemp, MAX_PATH);
  167.         pszName=szTemp;
  168.         }
  169. else
  170.         pszName=NULL;
  171.     return StgCreateDocfile(pszName, grfMode, reserved
  172.         , ppIStorage);
  173.     }
  174. STDAPI INOLE_StgOpenStorage(LPCSTR pszNameA, IStorage *pStgPri
  175.     , DWORD grfMode, SNB snbEx, DWORD reserved
  176.     , IStorage * *ppIStorage)
  177.     {
  178.     OLECHAR   szTemp[MAX_PATH];
  179.     LPOLESTR  pszName;
  180.     *ppIStorage=NULL;
  181.     if (NULL!=pszNameA)
  182.         {
  183.         MultiByteToWideChar(CP_ACP, 0, pszNameA, -1
  184.             , szTemp, MAX_PATH);
  185.         pszName= szTemp;
  186.         }
  187. else
  188.         pszName=NULL;
  189.     return StgOpenStorage(pszName, pStgPri, grfMode, snbEx
  190.         , reserved, ppIStorage);
  191.     }
  192. /*
  193.  * INOLE_CreateFileMoniker
  194.  * INOLE_CreateItemMoniker
  195.  * INOLE_MkParseDisplayName
  196.  */
  197. STDAPI INOLE_CreateFileMoniker(LPCSTR pszPathNameA, LPMONIKER *ppmk)
  198.     {
  199.     OLECHAR     szTemp[MAX_PATH];
  200.     if (NULL==ppmk)
  201.         return ResultFromScode(E_INVALIDARG);
  202.     *ppmk=NULL;
  203.     MultiByteToWideChar(CP_ACP, 0, pszPathNameA, -1
  204.         , szTemp, MAX_PATH);
  205.     return CreateFileMoniker(szTemp, ppmk);
  206.     }
  207. STDAPI INOLE_CreateItemMoniker(LPCSTR pszDelimA, LPCSTR pszItemA
  208.     , LPMONIKER *ppmk)
  209.     {
  210.     OLECHAR     szItem[MAX_PATH];   //Some assumptions about string length
  211.     OLECHAR     szDelim[20];
  212.     if (NULL==ppmk)
  213.         return ResultFromScode(E_INVALIDARG);
  214.     *ppmk=NULL;
  215.     MultiByteToWideChar(CP_ACP, 0, pszItemA, -1
  216.         , szItem, MAX_PATH);
  217.     MultiByteToWideChar(CP_ACP, 0, pszDelimA, -1
  218.         , szDelim, 20);
  219.     return CreateItemMoniker(szDelim, szItem, ppmk);
  220.     }
  221. STDAPI INOLE_MkParseDisplayName(LPBC pbc, LPCSTR pszUserNameA
  222.     , ULONG *pchEaten, LPMONIKER *ppmk)
  223.     {
  224.     OLECHAR     szTemp[512];    //Assumption on string length
  225.     if (NULL==ppmk)
  226.         return ResultFromScode(E_INVALIDARG);
  227.     *ppmk=NULL;
  228.     MultiByteToWideChar(CP_ACP, 0, pszUserNameA, -1
  229.         , szTemp, 512);
  230.     return MkParseDisplayName(pbc, szTemp, pchEaten, ppmk);
  231.     }
  232. /*
  233.  * INOLE_OleCreateLinkToFile
  234.  * INOLE_OleCreateFromFile
  235.  */
  236. STDAPI INOLE_OleCreateLinkToFile(LPCSTR lpszFileName, REFIID riid
  237.     , DWORD renderopt, LPFORMATETC lpFormatEtc
  238.     , LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID *ppvObj)
  239.     {
  240.     OLECHAR     szFile[512];    //Assumption on string length
  241.     MultiByteToWideChar(CP_ACP, 0, lpszFileName, -1, szFile, 512);
  242.     return OleCreateLinkToFile(szFile, riid, renderopt, lpFormatEtc
  243.         , pClientSite, pStg, ppvObj);
  244.     }
  245. STDAPI INOLE_OleCreateFromFile(REFCLSID rclsid, LPCSTR lpszFileName
  246.     , REFIID riid, DWORD renderopt, LPFORMATETC lpFormatEtc
  247.     , LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID *ppvObj)
  248.     {
  249.     OLECHAR     szFile[512];    //Assumption on string length
  250.     MultiByteToWideChar(CP_ACP, 0, lpszFileName, -1, szFile, 512);
  251.     return OleCreateFromFile(rclsid, szFile, riid, renderopt, lpFormatEtc
  252.         , pClientSite, pStg, ppvObj);
  253.     }
  254. #else
  255. //Do-nothing functions so we can at least export them.
  256. #ifndef WIN32
  257. STDAPI INOLE_ConvertStringToANSI(LPCSTR a, LPSTR *b) {return NOERROR;}
  258. #else
  259. STDAPI INOLE_ConvertStringToANSI(LPCWSTR a, LPSTR *b) {return NOERROR;}
  260. #endif
  261. STDAPI INOLE_StringFromCLSID(REFCLSID a, LPSTR *b) {return NOERROR;}
  262. STDAPI INOLE_StringFromGUID2(REFGUID a, LPSTR b, int c) {return NOERROR;}
  263. STDAPI INOLE_ProgIDFromCLSID(REFCLSID a, LPSTR *b) {return NOERROR;}
  264. STDAPI INOLE_ReadFmtUserTypeStg(IStorage *a, CLIPFORMAT *b, LPSTR *c) {return NOERROR;}
  265. STDAPI INOLE_WriteFmtUserTypeStg(IStorage *a, CLIPFORMAT b, LPSTR c) {return NOERROR;}
  266. STDAPI INOLE_StgIsStorageFile(LPCSTR a) {return NOERROR;}
  267. STDAPI INOLE_StgCreateDocfile(LPCSTR a, DWORD b, DWORD c, IStorage ** d) {return NOERROR;}
  268. STDAPI INOLE_StgOpenStorage(LPCSTR a, IStorage *b, DWORD c, SNB d
  269.            , DWORD e, IStorage **f) {return NOERROR;}
  270. STDAPI INOLE_CreateFileMoniker(LPCSTR, LPMONIKER *) {return NOERROR;}
  271. STDAPI INOLE_CreateItemMoniker(LPCSTR, LPCSTR, LPMONIKER *) {return NOERROR;}
  272. STDAPI INOLE_MkParseDisplayName(LPBC, LPCSTR, ULONG *, LPMONIKER *) {return NOERROR;}
  273. STDAPI INOLE_OleCreateLinkToFile(LPCOLESTR, REFIID, DWORD, LPFORMATETC
  274.     , LPOLECLIENTSITE, LPSTORAGE, LPVOID *) {return NOERROR;}
  275. STDAPI INOLE_OleCreateFromFile(REFCLSID, LPCOLESTR, REFIID
  276.     , DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, LPVOID *) {return NOERROR;}
  277. #endif