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

📄 primenumbers.h

📁 The source code samples for chapter 2, 4, 6, and 8 are contained in the EvenChapters project. Those
💻 H
字号:
// PrimeNumbers.h : Declaration of the CPrimeNumbers

#ifndef __PRIMENUMBERS_H_
#define __PRIMENUMBERS_H_

#include "resource.h"       // main symbols

/////////////////////////////////////////////////////////////////////////////
// CPrimeNumbers

struct _CopyVariantFromLong {
	static HRESULT copy(VARIANT* p1, long* p2) {
    p1->vt = VT_I4;
    p1->lVal = *p2;
    return S_OK;
  }
	
  static void init(VARIANT* p)    { VariantInit(p); }
  static void destroy(VARIANT* p) { VariantClear(p); }
};

typedef CComEnumOnSTL<IEnumPrimes, &IID_IEnumPrimes, long, _Copy<long>, vector<long> >
        CComEnumPrimesOnVectorOfLongs;

class ATL_NO_VTABLE CPrimeNumbers : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<CPrimeNumbers, &CLSID_PrimeNumbers>,
  public IDispatchImpl<IPrimeNumbers, &IID_IPrimeNumbers, &LIBID_PRIMESVRLib>
{
public:

DECLARE_REGISTRY_RESOURCEID(IDR_PRIMENUMBERS)
DECLARE_NOT_AGGREGATABLE(CPrimeNumbers)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CPrimeNumbers)
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(IPrimeNumbers)
END_COM_MAP()

// IPrimeNumbers
public:
  STDMETHODIMP CalcPrimes(long min, long max)
  {
    m_rgPrimes.clear();

    for( long n = min; n <= max; ++n )
    {
      if( IsPrime(n) )
      {
        m_rgPrimes.push_back(n);
      }
    }

    return S_OK;
  }

  STDMETHODIMP get_Count(long* pnCount)
  {
    *pnCount = m_rgPrimes.size();
    return S_OK;
  }

  STDMETHODIMP get_Item(long n, long* pnPrime)
  {
    if( n >= 1 && n <= m_rgPrimes.size() )
    {
      *pnPrime = m_rgPrimes[n-1];
      return S_OK;
    }

    return E_INVALIDARG;
  }

  // w/ STL
  STDMETHODIMP get_Enum(IEnumPrimes** ppEnum)
  {
    *ppEnum = 0;

    CComObject<CComEnumPrimesOnVectorOfLongs>* pe = 0;
    HRESULT hr = pe->CreateInstance(&pe);
    if( SUCCEEDED(hr) )
    {
      pe->AddRef();
      hr = pe->Init(this, m_rgPrimes);
      if( SUCCEEDED(hr) )
      {
        hr = pe->QueryInterface(ppEnum);
      }

      pe->Release();
    }
    else
    {
      hr = E_OUTOFMEMORY;
    }

    return hr;
  }

private:
  vector<long>  m_rgPrimes;
};

#endif //__PRIMENUMBERS_H_

⌨️ 快捷键说明

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