// beepobj.cpp : Implementation of CBeeperApp and DLL registration. // // This is a part of the Active Template Library. // Copyright (C) 1996-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Active Template Library Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Active Template Library product. #include "prebeep.h" #include "beeper.h" #include "beepobj.h" LPCOLESTR arr[] = {OLESTR("Hello"), OLESTR("World"), OLESTR("From"), OLESTR("Beeper")}; ///////////////////////////////////////////////////////////////////////////// // CBeeper::CBeeper() { m_nCnt = 0; for (int i = 0; i < 4; i++) m_var[i] = arr[i]; } STDMETHODIMP CBeeper::Beep() { if (m_nCnt++ == 5) { m_nCnt = 0; return Error(L"Too many beeps"); } MessageBeep(0); return S_OK; } STDMETHODIMP CBeeper::get_Count(long* retval) { if (retval == NULL) return E_POINTER; *retval = 4; return S_OK; } STDMETHODIMP CBeeper::get_Item(long Index, BSTR* pbstr) { if (pbstr == NULL) return E_POINTER; if (Index > 4) *pbstr = NULL; *pbstr = SysAllocString(arr[Index-1]); return S_OK; } STDMETHODIMP CBeeper::get__NewEnum(IUnknown** retval) { if (retval == NULL) return E_POINTER; *retval = NULL; typedef CComObject > > enumvar; HRESULT hRes = S_OK; enumvar* p = new enumvar; if (p == NULL) hRes = E_OUTOFMEMORY; else { hRes = p->FinalConstruct(); if (hRes == S_OK) { hRes = p->Init(&m_var[0], &m_var[4], NULL, AtlFlagCopy); if (hRes == S_OK) hRes = p->QueryInterface(IID_IUnknown, (void**)retval); } } if (hRes != S_OK) delete p; return hRes; }