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

Windows编程

开发平台:

Visual C++

  1. // mfcdual.h: Helpful macros 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. /////////////////////////////////////////////////////////////////////
  13. // BEGIN_DUAL_INTERFACE_PART is just like BEGIN_INTERFACE_PART,
  14. // except that it also adds the IDispatch methods to your class
  15. // declaration.
  16. #define BEGIN_DUAL_INTERFACE_PART(localClass, baseClass) 
  17. BEGIN_INTERFACE_PART(localClass, baseClass) 
  18.    STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo); 
  19.    STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo); 
  20.    STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid); 
  21.    STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr); 
  22. /////////////////////////////////////////////////////////////////////
  23. // END_DUAL_INTERFACE_PART is just like END_INTERFACE_PART. It
  24. // is only added for symmetry...
  25. #define END_DUAL_INTERFACE_PART(localClass) 
  26. END_INTERFACE_PART(localClass) 
  27. /////////////////////////////////////////////////////////////////////
  28. // DELEGATE_DUAL_INTERFACE expands to define the standard IDispatch
  29. // methods for a dual interface, delegating back to the default
  30. // MFC implementation
  31. #define DELEGATE_DUAL_INTERFACE(objectClass, dualClass) 
  32. STDMETHODIMP_(ULONG) objectClass::X##dualClass::AddRef() 
  33. METHOD_PROLOGUE(objectClass, dualClass) 
  34. return pThis->ExternalAddRef(); 
  35. STDMETHODIMP_(ULONG) objectClass::X##dualClass::Release() 
  36. METHOD_PROLOGUE(objectClass, dualClass) 
  37. return pThis->ExternalRelease(); 
  38. STDMETHODIMP objectClass::X##dualClass::QueryInterface( 
  39. REFIID iid, LPVOID* ppvObj) 
  40. METHOD_PROLOGUE(objectClass, dualClass) 
  41. return pThis->ExternalQueryInterface(&iid, ppvObj); 
  42. STDMETHODIMP objectClass::X##dualClass::GetTypeInfoCount( 
  43. UINT FAR* pctinfo) 
  44. METHOD_PROLOGUE(objectClass, dualClass) 
  45. LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE); 
  46. ASSERT(lpDispatch != NULL); 
  47. return lpDispatch->GetTypeInfoCount(pctinfo); 
  48. STDMETHODIMP objectClass::X##dualClass::GetTypeInfo( 
  49. UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo) 
  50. METHOD_PROLOGUE(objectClass, dualClass) 
  51. LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE); 
  52. ASSERT(lpDispatch != NULL); 
  53. return lpDispatch->GetTypeInfo(itinfo, lcid, pptinfo); 
  54. STDMETHODIMP objectClass::X##dualClass::GetIDsOfNames( 
  55. REFIID riid, OLECHAR FAR* FAR* rgszNames, UINT cNames, 
  56. LCID lcid, DISPID FAR* rgdispid) 
  57. METHOD_PROLOGUE(objectClass, dualClass) 
  58. LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE); 
  59. ASSERT(lpDispatch != NULL); 
  60. return lpDispatch->GetIDsOfNames(riid, rgszNames, cNames, 
  61.  lcid, rgdispid); 
  62. STDMETHODIMP objectClass::X##dualClass::Invoke( 
  63. DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, 
  64. DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, 
  65. EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr) 
  66. METHOD_PROLOGUE(objectClass, dualClass) 
  67. LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE); 
  68. ASSERT(lpDispatch != NULL); 
  69. return lpDispatch->Invoke(dispidMember, riid, lcid, 
  70.   wFlags, pdispparams, pvarResult, 
  71.   pexcepinfo, puArgErr); 
  72. /////////////////////////////////////////////////////////////////////
  73. // TRY_DUAL and CATCH_ALL_DUAL are used to provide exception handling
  74. // for your dual interface methods. CATCH_ALL_DUAL takes care of
  75. // returning the appropriate error code.
  76. #define TRY_DUAL(iidSource) 
  77. HRESULT _hr = S_OK; 
  78. REFIID  _riidSource = iidSource; 
  79. TRY 
  80. #define CATCH_ALL_DUAL 
  81. CATCH(COleException, e) 
  82. _hr = e->m_sc; 
  83. AND_CATCH_ALL(e) 
  84. AFX_MANAGE_STATE(pThis->m_pModuleState); 
  85. _hr = DualHandleException(_riidSource, e); 
  86. END_CATCH_ALL 
  87. return _hr; 
  88. /////////////////////////////////////////////////////////////////////
  89. // DualHandleException is a helper function used to set the system's
  90. // error object, so that container applications that call through
  91. // VTBLs can retrieve rich error information
  92. HRESULT DualHandleException(REFIID riidSource, const CException* pAnyException);
  93. /////////////////////////////////////////////////////////////////////
  94. // DECLARE_DUAL_ERRORINFO expands to declare the ISupportErrorInfo
  95. // support class. It works together with DUAL_ERRORINFO_PART and
  96. // IMPLEMENT_DUAL_ERRORINFO defined below.
  97. #define DECLARE_DUAL_ERRORINFO() 
  98. BEGIN_INTERFACE_PART(SupportErrorInfo, ISupportErrorInfo) 
  99. STDMETHOD(InterfaceSupportsErrorInfo)(THIS_ REFIID riid); 
  100. END_INTERFACE_PART(SupportErrorInfo) 
  101. /////////////////////////////////////////////////////////////////////
  102. // DUAL_ERRORINFO_PART adds the appropriate entry to the interface map
  103. // for ISupportErrorInfo, if you used DECLARE_DUAL_ERRORINFO.
  104. #define DUAL_ERRORINFO_PART(objectClass) 
  105. INTERFACE_PART(objectClass, IID_ISupportErrorInfo, SupportErrorInfo) 
  106. /////////////////////////////////////////////////////////////////////
  107. // IMPLEMENT_DUAL_ERRORINFO expands to an implementation of
  108. // ISupportErrorInfo which matches the declaration in
  109. // DECLARE_DUAL_ERRORINFO.
  110. #define IMPLEMENT_DUAL_ERRORINFO(objectClass, riidSource) 
  111. STDMETHODIMP_(ULONG) objectClass::XSupportErrorInfo::AddRef() 
  112. METHOD_PROLOGUE(objectClass, SupportErrorInfo) 
  113. return pThis->ExternalAddRef(); 
  114. STDMETHODIMP_(ULONG) objectClass::XSupportErrorInfo::Release() 
  115. METHOD_PROLOGUE(objectClass, SupportErrorInfo) 
  116. return pThis->ExternalRelease(); 
  117. STDMETHODIMP objectClass::XSupportErrorInfo::QueryInterface( 
  118. REFIID iid, LPVOID* ppvObj) 
  119. METHOD_PROLOGUE(objectClass, SupportErrorInfo) 
  120. return pThis->ExternalQueryInterface(&iid, ppvObj); 
  121. STDMETHODIMP objectClass::XSupportErrorInfo::InterfaceSupportsErrorInfo( 
  122. REFIID iid) 
  123. METHOD_PROLOGUE(objectClass, SupportErrorInfo) 
  124. return (iid == riidSource) ? S_OK : S_FALSE; 
  125. }
  126. /////////////////////////////////////////////////////////////////////