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

Windows编程

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. // Helpers.h
  3. //---------------------------------------------------------------------------
  4. // General OLE Automation helper functions.
  5. //---------------------------------------------------------------------------
  6. // (C) Copyright 1995-1997 by Microsoft Corporation.  All rights reserved.
  7. //
  8. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  9. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  10. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  11. // PARTICULAR PURPOSE.
  12. //---------------------------------------------------------------------------
  13. //---------------------------------------------------------------------------
  14. // To make the OLE-related code easier to read
  15. //---------------------------------------------------------------------------
  16. #define CHECK(x)       { hr = (x);  if (hr) { FAIL("Bad hr"); goto CleanUp; } }
  17. #define CHECKSZ(x,sz)  { hr = (x);  if (hr) { FAIL(sz);       goto CleanUp; } }
  18. #define CHECKCL(x)     { hr = (x);  if (hr) { FAIL("Bad hr"); goto CheckLoop; } }
  19. #define ARGSZ(f,sz)    {            if (f)  { FAIL(sz);       return E_INVALIDARG; } }
  20. #define CHECKOS(x) { if (ERROR_SUCCESS!=(x)) { FAIL("Bad"); hr=E_FAIL; goto CleanUp; } }
  21. #define RELEASEPTRTYPE(p,typ) 
  22.   {                           
  23.     if (p)                    
  24.       {                       
  25.       typ *__punk = (p);      
  26.       (p) = NULL;             
  27.       __punk->Release();      
  28.       }                       
  29.   }
  30. #define RELEASEPTR(p)     RELEASEPTRTYPE(p,IUnknown)
  31. //---------------------------------------------------------------------------
  32. // Allocates a temporary buffer that will disappear when it goes out of scope
  33. // NOTE: Be careful of that-- make sure you use the string in the same or
  34. // nested scope in which you created this buffer.  People should not use this
  35. // class directly; use the macro(s) below.
  36. //---------------------------------------------------------------------------
  37. class TempBuffer
  38.   {
  39.   public:
  40.     TempBuffer(ULONG cb)
  41.       {
  42.       m_fAlloc = (cb > 120);
  43.       if (m_fAlloc)
  44.         m_pbBuf = new char[cb];
  45.       else
  46.         m_pbBuf = &m_szBufT;
  47.       }
  48.     ~TempBuffer()
  49.       { if (m_pbBuf && m_fAlloc) delete m_pbBuf; }
  50.     void *GetBuffer(void)
  51.       { return m_pbBuf; }
  52.   private:
  53.     void *m_pbBuf;
  54.     char  m_szBufT[120];  // We'll use this temp buffer for small cases.
  55.     int   m_fAlloc;
  56.   };
  57. //---------------------------------------------------------------------------
  58. // String helpers.
  59. //---------------------------------------------------------------------------
  60. // Given and ANSI String, copy it into a wide buffer.
  61. // NOTE: Be careful about scoping when using this macro!
  62. //
  63. // How to use the below two macros:
  64. //
  65. //  ...
  66. //  LPSTR pszA;
  67. //  pszA = MyGetpszAnsiingRoutine();
  68. //  MAKE_WIDEPTR_FROMANSI(pwsz, pszA);
  69. //  MyUseWideStringRoutine(pwsz);
  70. //  ...
  71. //
  72. // Similarily for MAKE_ANSIPTR_FROMWIDE().  Note that the first param does
  73. // not have to be declared, and no clean up must be done.
  74. //---------------------------------------------------------------------------
  75. #define UNICODE_FROM_ANSI(pwszUnicode, pszAnsi, cb) 
  76.     MultiByteToWideChar(CP_ACP, 0, pszAnsi, -1, pwszUnicode, cb);
  77. #define MAKE_WIDEPTR_FROMANSI(ptrname, pszAnsi) 
  78.     char *__psz##ptrname = pszAnsi?pszAnsi:""; 
  79.     long __l##ptrname = (lstrlen(__psz##ptrname) + 1) * sizeof(WCHAR); 
  80.     TempBuffer __TempBuffer##ptrname(__l##ptrname); 
  81.     MultiByteToWideChar(CP_ACP, 0, __psz##ptrname, -1, (LPWSTR)__TempBuffer##ptrname.GetBuffer(), __l##ptrname); 
  82.     LPWSTR ptrname = (LPWSTR)__TempBuffer##ptrname.GetBuffer()
  83. #define MAKE_ANSIPTR_FROMWIDE(ptrname, pwszUnicode) 
  84.     WCHAR *__pwsz##ptrname = pwszUnicode?pwszUnicode:L""; 
  85.     long __l##ptrname = (lstrlenW(__pwsz##ptrname) + 1) * sizeof(char); 
  86.     TempBuffer __TempBuffer##ptrname(__l##ptrname); 
  87.     WideCharToMultiByte(CP_ACP, 0, __pwsz##ptrname, -1, (LPSTR)__TempBuffer##ptrname.GetBuffer(), __l##ptrname, NULL, NULL); 
  88.     LPSTR ptrname = (LPSTR)__TempBuffer##ptrname.GetBuffer()
  89. //--- EOF -------------------------------------------------------------------