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

Windows编程

开发平台:

Visual C++

  1. // util.cpp - Common utilities for printing out messages
  2. //
  3. // This is a part of the Active Template Library.
  4. // Copyright (C) 1996-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Active Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Active Template Library product.
  12. #include <objbase.h>
  13. #include <stdio.h> //sprintf..
  14. #include <stdlib.h>
  15. #include <stdarg.h>
  16. #include "util.h"
  17. /////////////////////////////////////////////////////////////////////////////
  18. //
  19. void ErrorMessage(LPCTSTR message, HRESULT hr)
  20. {
  21. const char* sz ;
  22. if (message == NULL)
  23. sz = "The following error occured." ;
  24. else
  25. sz = message;
  26. void* pMsgBuf;
  27. ::FormatMessage(
  28.  FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  29.  NULL,
  30.  hr,
  31.  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  32.  (LPTSTR) &pMsgBuf,
  33.  0,
  34.  NULL
  35. );
  36. TCHAR buf[1024];
  37. wsprintf(buf, "%srnError: (0x%x) - %s", sz, hr, (LPTSTR) pMsgBuf);
  38. MessageBox(NULL, buf, "Utility Error Message Box.", MB_OK);
  39. // Free the buffer.
  40. LocalFree(pMsgBuf);
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. //  Check to see if both interfaces are on the same component.
  44. BOOL InterfacesAreOnSameComponent(IUnknown* p1, IUnknown* p2)
  45. {
  46. HRESULT hr = S_OK ;
  47. // Get the real IUnknown for the first interface.
  48. IUnknown* pReal1 = NULL ;
  49. hr = p1->QueryInterface(IID_IUnknown, (void**)&pReal1) ;
  50. assert(SUCCEEDED(hr)) ;
  51. // Get the real IUnknown for the second interface.
  52. IUnknown* pReal2 = NULL ;
  53. hr = p2->QueryInterface(IID_IUnknown, (void**)&pReal2) ;
  54. assert(SUCCEEDED(hr)) ;
  55. // Compare the IUnknown pointers.
  56. BOOL bReturn = (pReal1 == pReal2) ;
  57. // Cleanup
  58. pReal1->Release() ;
  59. pReal2->Release() ;
  60. // Return the value.
  61. return bReturn;
  62. }
  63. /////////////////////////////////////////////////////////////////////////////
  64. //  IsValidAddress
  65. BOOL IsValidAddress(const void* lp, UINT nBytes, BOOL bReadWrite)
  66. {
  67. return (lp != NULL && !::IsBadReadPtr(lp, nBytes) &&
  68. (!bReadWrite || !::IsBadWritePtr((LPVOID)lp, nBytes)));
  69. }
  70. ///////////////////////////////////////////////////////////
  71. //
  72. //  Trace
  73. //
  74. void __cdecl MyTrace(LPCTSTR lpszFormat, ...)
  75. {
  76. va_list args;
  77. va_start(args, lpszFormat);
  78. int nBuf;
  79. TCHAR szBuffer[512];
  80. nBuf = _vsnprintf(szBuffer, sizeof(szBuffer)*sizeof(TCHAR), lpszFormat, args);
  81. // was there an error? was the expanded string too long?
  82. assert(nBuf > 0);
  83. OutputDebugString(szBuffer) ;
  84. va_end(args);
  85. }