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

Windows编程

开发平台:

Visual C++

  1. /*************************************************************************
  2. **
  3. **  This is a part of the Microsoft Source Code Samples.
  4. **
  5. **  Copyright (C) 1992-1997 Microsoft Corporation. All rights reserved.
  6. **
  7. **  This source code is only intended as a supplement to Microsoft Development
  8. **  Tools and/or WinHelp documentation.  See these sources for detailed
  9. **  information regarding the Microsoft samples programs.
  10. **
  11. **  OLE Automation TypeLibrary Browse Helper Sample
  12. **
  13. **  union.cpp
  14. **
  15. **  CUnion implementation
  16. **
  17. **  Written by Microsoft Product Support Services, Windows Developer Support
  18. **
  19. *************************************************************************/
  20. #include <windows.h>
  21. #include <windowsx.h>
  22. #ifdef WIN16   
  23.   #include <ole2.h>
  24.   #include <compobj.h>    
  25.   #include <dispatch.h> 
  26.   #include <variant.h>
  27.   #include <olenls.h>  
  28. #endif 
  29. #include "browseh.h"  
  30. /*
  31.  * CUnion::Create
  32.  *
  33.  * Purpose:
  34.  *  Creates an instance of the Union automation object and initializes it.
  35.  *
  36.  * Parameters:       
  37.  *  ptinfo     TypeInfo of Union.
  38.  *  ppUnion    Returns Union automation object.
  39.  *
  40.  * Return Value:
  41.  *  HRESULT
  42.  *
  43.  */
  44. HRESULT 
  45. CUnion::Create(LPTYPEINFO ptinfo, CUnion FAR* FAR* ppUnion) 
  46. {   
  47.     HRESULT hr;
  48.     CUnion FAR* pUnion = NULL;
  49.      
  50.     *ppUnion = NULL;
  51.     
  52.     // Create application object.
  53.     pUnion = new CUnion();
  54.     if (pUnion == NULL)
  55.     {
  56.         hr = E_OUTOFMEMORY; 
  57.         goto error;
  58.     }   
  59.     // Load type information for the object from type library. 
  60.     hr = pUnion->LoadTypeInfo(IID_IUnion);
  61.     if (FAILED(hr))
  62.         goto error;  
  63.     // Initialise base class, CTypeInfo.    
  64.     hr = pUnion->_InitTypeInfo(ptinfo);
  65.     if (FAILED(hr))
  66.         goto error;
  67.     
  68.     ptinfo->AddRef();
  69.     pUnion->m_ptinfo = ptinfo;
  70. #ifdef _DEBUG  
  71.     lstrcpyn(pUnion->m_szClassName, TEXT("Union"), 100);
  72. #endif
  73.         
  74.     *ppUnion = pUnion;
  75.     return NOERROR;
  76.     
  77. error:
  78.     if (pUnion == NULL) return E_OUTOFMEMORY;
  79.     if (pUnion->m_ptinfo) pUnion->m_ptinfo->Release();
  80.          
  81.     // Set to NULL to prevent destructor from attempting to free again  
  82.     pUnion->m_ptinfo = NULL;
  83.     
  84.     delete pUnion;
  85.     return hr;
  86. }
  87. /*
  88.  * CUnion::CUnion
  89.  *
  90.  * Purpose:
  91.  *  Constructor for CUnion object. Initializes members to NULL.
  92.  *
  93.  */
  94. CUnion::CUnion()
  95. {
  96.     m_pdispMembers = NULL;      
  97.     m_ptinfo = NULL;
  98. }
  99. /*
  100.  * CUnion::~CUnion
  101.  *
  102.  * Purpose:
  103.  *  Destructor for CUnion object. 
  104.  *
  105.  */
  106. CUnion::~CUnion()
  107. {
  108.     if (m_pdispMembers) m_pdispMembers->Release();
  109.     if (m_ptinfo) m_ptinfo->Release();
  110. }  
  111. STDMETHODIMP_(REFCLSID)
  112. CUnion::GetInterfaceID()
  113. {
  114.     return IID_IUnion;
  115. }
  116. /*
  117.  * CUnion::
  118.  *
  119.  * Purpose:
  120.  *  
  121.  *
  122.  */
  123. STDMETHODIMP_(ICollection FAR*)
  124. CUnion::get_Members()     
  125. {    
  126.     HRESULT hr;
  127.     CProperty FAR* pProperty;
  128.     CCollection FAR* pCollection = NULL;
  129.     LPDISPATCH pdisp;
  130.     LPVARDESC pvardesc = NULL;   
  131.     LPTYPEATTR ptypeattr = NULL;
  132.     unsigned short n;
  133.     
  134.     if (m_pdispMembers == NULL)
  135.     {   
  136.         // Create collection of union memebers. 
  137.         hr = m_ptinfo->GetTypeAttr(&ptypeattr);
  138.         if (FAILED(hr))
  139.             {RaiseException(IDS_Unexpected); return NULL;}       
  140.         hr = CCollection::Create(ptypeattr->cVars, 0, &pCollection);  
  141.         if (FAILED(hr))
  142.             {RaiseException(IDS_Unexpected); goto error;}   
  143.         for (n=0; n<ptypeattr->cVars; n++)
  144.         {       
  145.             hr = m_ptinfo->GetVarDesc(n, &pvardesc);   
  146.             if (FAILED(hr))
  147.                 {RaiseException(IDS_Unexpected); goto error;}   
  148.             hr = CProperty::Create(m_ptinfo, pvardesc, &pProperty);
  149.             if (FAILED(hr))
  150.                 {RaiseException(IDS_Unexpected); goto error;}    
  151.             m_ptinfo->ReleaseVarDesc(pvardesc); 
  152.             pvardesc = NULL;
  153.             pProperty->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp);
  154.             pCollection->Add(pdisp);   
  155.             pdisp->Release();
  156.         }
  157.         pCollection->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp);
  158.         m_pdispMembers = pdisp;    
  159.         m_ptinfo->ReleaseTypeAttr(ptypeattr); 
  160.     }
  161.     m_pdispMembers->AddRef();
  162.     return (ICollection FAR*)m_pdispMembers;
  163. error:  
  164.     if (ptypeattr) m_ptinfo->ReleaseTypeAttr(ptypeattr);   
  165.     if (pCollection) delete pCollection;   
  166.     if (pvardesc) m_ptinfo->ReleaseVarDesc(pvardesc);   
  167.     return NULL;
  168. }