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

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. **  alias.cpp
  14. **
  15. **  CAlias 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.  * CAlias::Create
  32.  *
  33.  * Purpose:
  34.  *  Creates an instance of the Alias automation object and initializes it.
  35.  *
  36.  * Parameters:       
  37.  *  ptinfo     Typeinfo of Alias.
  38.  *  ppAlias    Returns Alias automation object.
  39.  *
  40.  * Return Value:
  41.  *  HRESULT
  42.  *
  43.  */
  44. HRESULT
  45. CAlias::Create(LPTYPEINFO ptinfo, CAlias FAR* FAR* ppAlias) 
  46. {   
  47.     HRESULT hr;
  48.     CAlias FAR* pAlias = NULL;       
  49.     LPTYPEATTR ptypeattr = NULL; 
  50.     CTypeDesc FAR* pTypeDesc;
  51.      
  52.     *ppAlias = NULL;
  53.     
  54.     // Create alias object.
  55.     pAlias = new CAlias();
  56.     if (pAlias == NULL)
  57.     {
  58.         hr = E_OUTOFMEMORY; 
  59.         goto error;
  60.     }   
  61.     // Load type information for the object from type library. 
  62.     hr = pAlias->LoadTypeInfo(IID_IAlias);
  63.     if (FAILED(hr))
  64.         goto error;  
  65.     
  66.     // Ask base class (CTypeInfo) to initialize    
  67.     hr = pAlias->_InitTypeInfo(ptinfo);
  68.     if (FAILED(hr))
  69.         goto error;        
  70.     
  71.     // Get base type of this alias.
  72.     hr = ptinfo->GetTypeAttr(&ptypeattr); 
  73.     if (FAILED(hr))
  74.         return NULL;     
  75.     hr = CTypeDesc::Create(ptinfo, &ptypeattr->tdescAlias, &pTypeDesc);
  76.     if (FAILED(hr))
  77.         goto error;
  78.     pTypeDesc->QueryInterface(IID_IDispatch, (LPVOID FAR*)&pAlias->m_pdispTypeDescBase);
  79.     ptinfo->ReleaseTypeAttr(ptypeattr);
  80.     
  81. #ifdef _DEBUG  
  82.     lstrcpyn(pAlias->m_szClassName, TEXT("Alias"), 100);
  83. #endif
  84.         
  85.     *ppAlias = pAlias;
  86.     return NOERROR;
  87.     
  88. error:
  89.     if (pAlias == NULL) return E_OUTOFMEMORY;
  90.     if (pAlias->m_pdispTypeDescBase) pAlias->m_pdispTypeDescBase->Release();    
  91.     if (ptypeattr) ptinfo->ReleaseTypeAttr(ptypeattr); 
  92.          
  93.     // Set to NULL to prevent destructor from attempting to free again
  94.     pAlias->m_pdispTypeDescBase = NULL;
  95.     
  96.     delete pAlias;
  97.     return hr;
  98. }
  99. /*
  100.  * CAlias::CAlias
  101.  *
  102.  * Purpose:
  103.  *  Constructor for CAlias object. Initializes members to NULL.
  104.  *
  105.  */
  106. CAlias::CAlias()
  107. {
  108.     m_pdispTypeDescBase = NULL;
  109. }
  110. /*
  111.  * CAlias::~CAlias
  112.  *
  113.  * Purpose:
  114.  *  Destructor for CAlias object. 
  115.  *
  116.  */
  117. CAlias::~CAlias()
  118. {
  119.     if (m_pdispTypeDescBase) m_pdispTypeDescBase->Release();
  120. }  
  121. STDMETHODIMP_(REFCLSID)
  122. CAlias::GetInterfaceID()
  123. {
  124.     return IID_IAlias;
  125. }
  126.  
  127. STDMETHODIMP_(ITypeDesc FAR*)
  128. CAlias::get_BaseType()
  129. {
  130.     m_pdispTypeDescBase->AddRef();
  131.     return (ITypeDesc FAR*)m_pdispTypeDescBase;
  132. }