⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demagogue.h

📁 《ATL深入解析》随书源码
💻 H
字号:
// Demagogue.h : Declaration of the CDemagogue

#ifndef __DEMAGOGUE_H_
#define __DEMAGOGUE_H_

#include "resource.h"       // main symbols
#include "SpeakerEventsCP.h"

/////////////////////////////////////////////////////////////////////////////
// CDemagogue
class ATL_NO_VTABLE CDemagogue : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<CDemagogue, &CLSID_Demagogue>,
	public ISupportErrorInfo,
	public IDispatchImpl<ISpeaker, &IID_ISpeaker, &LIBID_ATLINTERNALSLib>,
	public CProxy_ISpeakerEvents<CDemagogue>,
	public IConnectionPointContainerImpl<CDemagogue>,
	public IDispatchImpl<INamedObject, &IID_INamedObject, &LIBID_ATLINTERNALSLib>,
    public IProvideClassInfo2Impl<&CLSID_Demagogue, &DIID__ISpeakerEvents, &LIBID_ATLINTERNALSLib, LIBRARY_MAJOR, LIBRARY_MINOR>,
    public IPersistPropertyBagImpl<CDemagogue>,
    public IPersistStreamInitImpl2<CDemagogue>,
    public IPersistMemoryImpl<CDemagogue>,
    public CSupportDirtyBit,
    public IMarshalByValueImpl<CDemagogue>
    {
public:
	CDemagogue()
	{
        m_volume = 0 ;
        m_name = OLESTR("Demosthenes") ;
        m_speech = 
        L"Phormio's inexperience in speaking, and his utter helplessness, "
        L"you all see for yourselves, men of Athens. "
        L"It is necessary for us, his friends, to state and set forth for you the facts, "
        L"which we know full well from having heard him often relate them; "
        L"in order that, when you have duly learned from us and have come to know the rights of the case, "
        L"you may give a verdict that is both just and in harmony with your oaths.";

    }

    void FinalRelease ()
    {
#ifdef _DEBUG
		int nConnections = m_vec.GetSize();
		int nConnectionIndex;
		
		for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) {
			CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
			if (sp != NULL)
                ATLASSERT (false); // We are going away with connections outstanding!!!
		}
#endif
    }

    static HRESULT WINAPI UpdateRegistry(BOOL b)
    {
        USES_CONVERSION;
        TCHAR szDate [32]; SYSTEMTIME st;  
        GetLocalTime(&st);
        wsprintf (szDate, _T("%.4d/%.2d/%.2d at %.2d:%.2d:%.2d"),
            st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
        _ATL_REGMAP_ENTRY rm[] = { { OLESTR("INSTALLDATE"), T2COLE(szDate)}, { 0, 0 }, };
        return _Module.UpdateRegistryFromResource(IDR_DEMAGOGUE, b, rm);
    }

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CDemagogue)
	COM_INTERFACE_ENTRY(ISpeaker)
	COM_INTERFACE_ENTRY2(IDispatch, ISpeaker)
	COM_INTERFACE_ENTRY(INamedObject)
	COM_INTERFACE_ENTRY(ISupportErrorInfo)
	COM_INTERFACE_ENTRY(IConnectionPointContainer)
    COM_INTERFACE_ENTRY(IProvideClassInfo2)
    COM_INTERFACE_ENTRY(IProvideClassInfo)
	COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
	COM_INTERFACE_ENTRY(IPersistStreamInit)
	COM_INTERFACE_ENTRY(IPersistPropertyBag)
    COM_INTERFACE_ENTRY(IPersistMemory)
    COM_INTERFACE_ENTRY(IMarshal)
END_COM_MAP()

BEGIN_CATEGORY_MAP(CDemagogue)
IMPLEMENTED_CATEGORY(CATID_ATLINTERNALS_SAMPLES)
END_CATEGORY_MAP()

BEGIN_PROP_MAP(CDemagogue)
PROP_ENTRY_EX("Speech", DISPID_SPEECH, CLSID_NULL, IID_ISpeaker)
PROP_ENTRY_EX("Volume", DISPID_VOLUME, CLSID_NULL, IID_ISpeaker)
PROP_ENTRY_EX("Name",   DISPID_NAME,   CLSID_NULL, IID_INamedObject)
END_PROP_MAP()

// ISupportsErrorInfo
	STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);

// ISpeaker
public:
    STDMETHODIMP Speak();

	STDMETHODIMP get_Speech(/*[out, retval]*/ BSTR *pVal);
	STDMETHODIMP put_Speech(/*[in]*/ BSTR newVal);
	STDMETHODIMP get_Volume(/*[out, retval]*/ long *pVal);
	STDMETHODIMP put_Volume(/*[in]*/ long newVal);

    STDMETHODIMP Load (IPropertyBag *pBag, IErrorLog *pLog)
    {
      CComVariant v ((BSTR) NULL);  // Initialize the VARIANT to VT_BSTR
      HRESULT hr = pBag->Read(OLESTR("Name"), &v, pLog);
      if (FAILED (hr)) return hr;
      m_name = v.bstrVal;

      v = 0L;                       // Initialize the VARIANT to VT_I4
      hr = pBag->Read(OLESTR("Volume"), &v, pLog);
      if (FAILED (hr)) return hr;
      m_volume = v.lVal;

      v = (BSTR) NULL;              // Initialize the VARIANT to VT_BSTR
      hr = pBag->Read(OLESTR("Speech"), &v, pLog);
      if (FAILED (hr)) return hr;
      m_speech = v.bstrVal;

      return S_OK;
    }

    STDMETHODIMP Save (IPropertyBag *pBag, BOOL /* fClearDirty */, BOOL /* fSaveAllProperties */)
    {
      CComVariant v = m_name;
      HRESULT hr = pBag->Write(OLESTR("Name"), &v);
      if (FAILED(hr)) return hr;

      v = m_volume;
      hr = pBag->Write(OLESTR("Volume"), &v);
      if (FAILED(hr)) return hr;

      v = m_speech;
      hr = pBag->Write(OLESTR("Speech"), &v);
      if (FAILED(hr)) return hr;

      // fClearDirty and fSaveAllProperties not used
      return hr;
    }


public :

BEGIN_CONNECTION_POINT_MAP(CDemagogue)
	CONNECTION_POINT_ENTRY(DIID__ISpeakerEvents)
END_CONNECTION_POINT_MAP()

// INamedObject
	STDMETHOD(get_Name)(/*[out, retval]*/ BSTR * pVal)
	{
		if (pVal == NULL) return E_POINTER;
        *pVal = m_name.Copy() ;		return S_OK;
	}
	STDMETHOD(put_Name)(/*[in]*/ BSTR pVal)
	{
        m_name = pVal;
        SetDirty(TRUE);
		return S_OK;
	}

private:
	CComBSTR m_name;
    long     m_volume;
	CComBSTR m_speech;
};

#endif //__DEMAGOGUE_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -