home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / oleaut / browseh / browseh.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-31  |  3.5 KB  |  149 lines

  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. **  browse.cpp
  14. **
  15. **  CBrowseHelper implementation
  16. **
  17. **  Written by Microsoft Product Support Services, Windows Developer Support
  18. **
  19. *************************************************************************/
  20.  
  21. #include <windows.h>
  22. #include <windowsx.h>
  23. #ifdef WIN16   
  24.   #include <ole2.h>
  25.   #include <compobj.h>    
  26.   #include <dispatch.h> 
  27.   #include <variant.h>
  28.   #include <olenls.h>  
  29. #endif 
  30. #include "browseh.h"  
  31.  
  32. /*
  33.  * CBrowseHelper::Create
  34.  *
  35.  * Purpose:
  36.  *  Creates an instance of the BrowseHelper automation object and initializes it.
  37.  *
  38.  * Parameters:
  39.  *  ppBrowseHelper   Returns BrowseHelper automation object.
  40.  *
  41.  * Return Value:
  42.  *  HRESULT
  43.  *
  44.  */
  45. HRESULT 
  46. CBrowseHelper::Create(CBrowseHelper FAR* FAR* ppBrowseHelper ) 
  47. {   
  48.     HRESULT hr;
  49.     CBrowseHelper FAR* pBrowseHelper = NULL;
  50.      
  51.     *ppBrowseHelper = NULL;
  52.     
  53.     // Create object.
  54.     pBrowseHelper = new CBrowseHelper();
  55.     if (pBrowseHelper == NULL)
  56.     {
  57.         hr = E_OUTOFMEMORY; 
  58.         goto error;
  59.     }
  60.  
  61.     // Load type information for the application object from type library. 
  62.     hr = pBrowseHelper->LoadTypeInfo(IID_IBrowseHelper);
  63.     if (FAILED(hr))
  64.         goto error;    
  65.         
  66. #ifdef _DEBUG  
  67.     lstrcpyn(pBrowseHelper->m_szClassName, TEXT("BrowseHelper"), 100);
  68. #endif
  69.         
  70.     *ppBrowseHelper = pBrowseHelper;
  71.     return NOERROR;
  72.     
  73. error:                        
  74.     if (pBrowseHelper == NULL)
  75.         return E_OUTOFMEMORY;
  76.  
  77.     delete pBrowseHelper;
  78.     return hr;
  79. }
  80.  
  81. /*
  82.  * CBrowseHelper::CBrowseHelper
  83.  *
  84.  * Purpose:
  85.  *  Constructor for CBrowseHelper object. Initializes members to NULL.
  86.  *
  87.  */
  88. CBrowseHelper::CBrowseHelper()
  89. {   
  90.     extern ULONG g_cObj;
  91.     g_cObj++;     
  92. }
  93.  
  94. /*
  95.  * CBrowseHelper::~CBrowseHelper
  96.  *
  97.  * Purpose:
  98.  *  Destructor for CBrowseHelper object. Frees BrowseHelper message BSTR and default
  99.  *  IDispatch implementation. Closes the aplication.
  100.  *
  101.  */
  102. CBrowseHelper::~CBrowseHelper()
  103.      extern ULONG g_cObj;
  104.  
  105.      g_cObj--;
  106. }
  107.  
  108. STDMETHODIMP_(REFCLSID)
  109. CBrowseHelper::GetInterfaceID()
  110. {
  111.     return IID_IBrowseHelper;
  112. }
  113.  
  114. /*
  115.  * CBrowseHelper::BrowseTypeLibrary
  116.  *
  117.  * Purpose:
  118.  *  Opens and browses type library. Creates and returns a TypeLibrary object.
  119.  *
  120.  */
  121. STDMETHODIMP_(ITypeLibrary FAR*)
  122. CBrowseHelper::BrowseTypeLibrary(BSTR bstrPath)
  123. {
  124.     LPTYPELIB ptlib = NULL;
  125.     LPDISPATCH pdisp;
  126.     HRESULT hr;     
  127.     CTypeLibrary FAR* pTypeLibrary;
  128.     
  129.     hr = LoadTypeLib(bstrPath, &ptlib);
  130.     if (FAILED(hr))
  131.         {RaiseException(IDS_CannotFindTypeLibrary); return NULL;} 
  132.         
  133.     hr = CTypeLibrary::Create(ptlib, &pTypeLibrary);
  134.     if (FAILED(hr))
  135.          {RaiseException(IDS_TypeLibraryCreationFailed); goto error;}
  136.     hr = pTypeLibrary->QueryInterface(IID_IDispatch, (void FAR* FAR*)&pdisp); 
  137.     if (FAILED(hr))
  138.         {RaiseException(IDS_Unexpected); goto error;}
  139.         
  140.     ptlib->Release();
  141.     return (ITypeLibrary FAR*)pdisp;
  142.     
  143. error:
  144.     if (ptlib)
  145.         ptlib->Release();
  146.     return NULL;
  147. }
  148.