home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 27 / IOPROG_27.ISO / SOFT / ADSDK.ZIP / Samples / Extension / Tutorial / step2 / HelloWorld.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-09-23  |  3.7 KB  |  163 lines

  1. // HelloWorld.cpp : Implementation of CADsFirstExtApp and DLL registration.
  2.  
  3. #include "stdafx.h"
  4. #include "ADsFirstExt.h"
  5. #include "HelloWorld.h"
  6.  
  7.  
  8. /////////////////////////////////////////////////////////////////////////////
  9. // Constructor/Destructor
  10. /////////////////////////////////////////////////////////////////////////////
  11. HelloWorld::HelloWorld()
  12. {
  13.     HRESULT hr;
  14.     ITypeLib   *pITypeLib;
  15.     m_pTypeInfo = NULL;
  16.     hr = LoadRegTypeLib( LIBID_ADSFIRSTEXTLib, 
  17.                               1, 
  18.                               0, 
  19.                               PRIMARYLANGID(GetSystemDefaultLCID()), 
  20.                               &pITypeLib );
  21.     if ( SUCCEEDED(hr) )
  22.     {
  23.  
  24.         hr   = pITypeLib->GetTypeInfoOfGuid( IID_IHelloWorld, &m_pTypeInfo);
  25.     }
  26.  
  27.     pITypeLib->Release();
  28.        
  29. }
  30.  
  31. HelloWorld::~HelloWorld()
  32. {
  33.     if ( m_pTypeInfo )
  34.     {
  35.         m_pTypeInfo->Release();
  36.     }
  37.     
  38. }
  39.  
  40.  
  41. /////////////////////////////////////////////////////////////////////////////
  42. // InterfaceSupportsErrorInfo
  43. /////////////////////////////////////////////////////////////////////////////
  44. STDMETHODIMP HelloWorld::InterfaceSupportsErrorInfo(REFIID riid)
  45. {
  46.     static const IID* arr[] = 
  47.     {
  48.         &IID_IHelloWorld,
  49.     };
  50.  
  51.     for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
  52.     {
  53.         if (InlineIsEqualGUID(*arr[i],riid))
  54.             return S_OK;
  55.     }
  56.     return S_FALSE;
  57. }
  58.  
  59.  
  60.  
  61. //////////////////////////////////////////////////// 
  62. // Delegating IDispatch Methods to the aggregator
  63. //////////////////////////////////////////////////////
  64. STDMETHODIMP HelloWorld::GetTypeInfoCount(UINT* pctinfo)
  65. {
  66.    IDispatch *pDisp;
  67.    HRESULT    hr;
  68.    hr = OuterQueryInterface( IID_IDispatch, (void**) &pDisp );
  69.    if ( SUCCEEDED(hr) )
  70.    {
  71.        hr = pDisp->GetTypeInfoCount( pctinfo );
  72.        pDisp->Release();
  73.    }   
  74.    return hr;
  75. }
  76.  
  77.  
  78. STDMETHODIMP HelloWorld::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
  79. {
  80.    IDispatch *pDisp;
  81.    HRESULT    hr;
  82.    hr = OuterQueryInterface( IID_IDispatch, (void**) &pDisp );
  83.    if ( SUCCEEDED(hr) )
  84.    {
  85.        hr = pDisp->GetTypeInfo( itinfo, lcid, pptinfo );
  86.        pDisp->Release();
  87.    }
  88.    
  89.    return hr;
  90. }
  91.  
  92. STDMETHODIMP HelloWorld::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
  93.         LCID lcid, DISPID* rgdispid)
  94. {
  95.    IDispatch *pDisp;
  96.    HRESULT    hr;
  97.    hr = OuterQueryInterface( IID_IDispatch, (void**) &pDisp );
  98.    if ( SUCCEEDED(hr) )
  99.    {
  100.        hr = pDisp->GetIDsOfNames( riid, rgszNames, cNames, lcid, rgdispid);
  101.        pDisp->Release();
  102.    }
  103.    
  104.    return hr;
  105.  
  106. }
  107.  
  108. STDMETHODIMP HelloWorld::Invoke(DISPID dispidMember, REFIID riid,
  109.         LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
  110.         EXCEPINFO* pexcepinfo, UINT* puArgErr)
  111. {
  112.    IDispatch *pDisp;
  113.    HRESULT    hr;
  114.    hr = OuterQueryInterface( IID_IDispatch, (void**) &pDisp );
  115.    if ( SUCCEEDED(hr) )
  116.    {
  117.        hr = pDisp->Invoke( dispidMember, riid, lcid, wFlags, pdispparams, pvarResult,
  118.                            pexcepinfo, puArgErr);
  119.        pDisp->Release();
  120.    }
  121.    
  122.    return hr;
  123. }
  124.  
  125. ///////////////////////////////////////////////////////////////////////////////
  126. // End delegating IDispatch Methods
  127. ///////////////////////////////////////////////////////////////////////////////
  128.  
  129.  
  130.  
  131. STDMETHODIMP HelloWorld::Say()
  132. {
  133.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  134.  
  135.     IADs *pADs;
  136.     HRESULT hr;
  137.     BSTR    bstr;
  138.     TCHAR  szText[128];
  139.  
  140.  
  141.  
  142.     hr = OuterQueryInterface(IID_IADs, (void **) &pADs );
  143.     if ( !SUCCEEDED(hr) )
  144.     {
  145.         return hr;
  146.     }
  147.  
  148.     hr = pADs->get_Name(&bstr);
  149.     if ( !SUCCEEDED(hr) )
  150.     {
  151.         pADs->Release();
  152.         return hr;
  153.     }
  154.     wsprintf(szText, _T("Hello %S"), bstr );
  155.     SysFreeString(bstr);
  156.  
  157.  
  158.     ::MessageBox(NULL, szText, _T("From ADSI Extension"), MB_OK);
  159.     pADs->Release();
  160.  
  161.     return S_OK;
  162. }
  163.