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

Windows编程

开发平台:

Visual C++

  1. // mfcdual.cpp: Helpful functions for adding dual interface support to
  2. //              MFC applications
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "AutoClik.h"
  14. #include <afxpriv.h>
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // DualHandleException
  22. HRESULT DualHandleException(REFIID riidSource, const CException* pAnyException)
  23. {
  24. USES_CONVERSION;
  25. ASSERT_VALID(pAnyException);
  26. TRACE0("DualHandleException calledn");
  27. // Set ErrInfo object so that VTLB binding container
  28. // applications can get rich error information.
  29. ICreateErrorInfo* pcerrinfo;
  30. HRESULT hr = CreateErrorInfo(&pcerrinfo);
  31. if (SUCCEEDED(hr))
  32. {
  33. TCHAR   szDescription[256];
  34. LPCTSTR pszDescription = szDescription;
  35. GUID    guid = GUID_NULL;
  36. DWORD   dwHelpContext = 0;
  37. BSTR    bstrHelpFile = NULL;
  38. BSTR    bstrSource = NULL;
  39. if (pAnyException->IsKindOf(RUNTIME_CLASS(COleDispatchException)))
  40. {
  41. // specific IDispatch style exception
  42. COleDispatchException* e = (COleDispatchException*)pAnyException;
  43. guid = riidSource;
  44. hr = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF,
  45.   (e->m_wCode + 0x200));
  46. pszDescription = e->m_strDescription;
  47. dwHelpContext = e->m_dwHelpContext;
  48. // propagate source and help file if present
  49. // call ::SysAllocString directly so no further exceptions are thrown
  50. if (!e->m_strHelpFile.IsEmpty())
  51. bstrHelpFile = ::SysAllocString(T2COLE(e->m_strHelpFile));
  52. if (!e->m_strSource.IsEmpty())
  53. bstrSource = ::SysAllocString(T2COLE(e->m_strSource));
  54. }
  55. else if (pAnyException->IsKindOf(RUNTIME_CLASS(CMemoryException)))
  56. {
  57. // failed memory allocation
  58. AfxLoadString(AFX_IDP_FAILED_MEMORY_ALLOC, szDescription);
  59. hr = E_OUTOFMEMORY;
  60. }
  61. else
  62. {
  63. // other unknown/uncommon error
  64. AfxLoadString(AFX_IDP_INTERNAL_FAILURE, szDescription);
  65. hr = E_UNEXPECTED;
  66. }
  67. if (bstrHelpFile == NULL && dwHelpContext != 0)
  68. bstrHelpFile = ::SysAllocString(T2COLE(AfxGetApp()->m_pszHelpFilePath));
  69. if (bstrSource == NULL)
  70. bstrSource = ::SysAllocString(T2COLE(AfxGetAppName()));
  71. // Set up ErrInfo object
  72. pcerrinfo->SetGUID(guid);
  73. pcerrinfo->SetDescription(::SysAllocString(T2COLE(pszDescription)));
  74. pcerrinfo->SetHelpContext(dwHelpContext);
  75. pcerrinfo->SetHelpFile(bstrHelpFile);
  76. pcerrinfo->SetSource(bstrSource);
  77. TRACE("tSource = %wsn", bstrSource);
  78. TRACE("tDescription = %sn", pszDescription);
  79. TRACE("tHelpContext = %lxn", dwHelpContext);
  80. TRACE("tHelpFile = %wsn", bstrHelpFile);
  81. // Set the ErrInfo object for the current thread
  82. IErrorInfo* perrinfo;
  83. if (SUCCEEDED(pcerrinfo->QueryInterface(IID_IErrorInfo, (LPVOID*)&perrinfo)))
  84. {
  85. SetErrorInfo(0, perrinfo);
  86. perrinfo->Release();
  87. }
  88. pcerrinfo->Release();
  89. }
  90. TRACE("DualHandleException returning HRESULT %lxn", hr);
  91. return hr;
  92. }