OSDN Git Service

20021009版ソース
[seraphyscrtools/SeraphyScriptTools.git] / generic.h
1 // GENERIC.h
2
3 #if !defined(SERAPHYSCRIPTTOOLS_GENERIC_HEADER)
4 #define SERAPHYSCRIPTTOOLS_GENERIC_HEADER
5
6 #define VB_TRUE -1
7 #define VB_FALSE 0
8
9 /*
10 #if defined(_DEBUG)
11 #define ATLTRACE(mes) OutputDebugString(mes)
12 #else
13 #define ATLTRACE(mes)
14 #endif
15 */
16
17 void ErrorInfo(int nMessageID);
18 SAFEARRAY* GetArrayFromVariant(VARIANT& var,VARTYPE* pVt);
19
20 // \92l\82ð\83R\83s\81[\82·\82é\83o\83\8a\83A\83\93\83g\97ñ\8b\93\8c^
21 typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > CComEnumVARIANT;
22
23 // \93®\93I\82È\83o\83\8a\83A\83\93\83g\97ñ\8b\93\8c^
24 template <class T>
25 class CComEnumDynaVARIANT :public IEnumVARIANT , public CComObjectRootEx<CComSingleThreadModel>
26 {
27 public:
28 BEGIN_COM_MAP(CComEnumDynaVARIANT)
29         COM_INTERFACE_ENTRY(IEnumVARIANT)
30         COM_INTERFACE_ENTRY(IUnknown)
31 END_COM_MAP()
32
33         CComEnumDynaVARIANT()
34         {
35                 m_current = 0;
36                 m_pObj = NULL;
37         }
38     STDMETHODIMP Next(unsigned long celt, VARIANT FAR* rgvar,  unsigned long FAR* pceltFetched);
39     STDMETHODIMP Skip(unsigned long celt);
40     STDMETHODIMP Reset();
41     STDMETHODIMP Clone(IEnumVARIANT FAR* FAR* ppenum);
42     void FinalRelease()
43         {
44                 if(m_pObj){
45                         m_pObj->Release();
46                         m_pObj = NULL;
47                 }
48                 ATLTRACE("CComEnumDynaVARINAT::FinalRelease\r\n");
49         }
50         void Init(T* pObj,unsigned long current)
51         {
52                 m_current = current;
53                 m_pObj = pObj;
54                 if(m_pObj){
55                         m_pObj->AddRef();
56                 }
57         }
58 protected:
59         unsigned long m_current;
60         T* m_pObj;
61 };
62
63 template<class T>
64 STDMETHODIMP CComEnumDynaVARIANT<T>::Next(unsigned long celt, VARIANT FAR* rgvar,  unsigned long FAR* pceltFetched)
65 {
66         // \96ß\82·\94z\97ñ\82Ì\92l\82ð\8f\89\8aú\89»
67         if(!m_pObj){
68                 return S_FALSE;
69         }
70         unsigned long i = 0;
71         for(i=0;i<celt;i++){
72                 ::VariantInit(&rgvar[i]);
73         }
74         unsigned long cnt = 0;
75         unsigned long mx  = 0;
76         m_pObj->get_Count((long*)&mx);
77         while(cnt < celt  && m_current < mx){
78                 CComVariant varIdx((long)m_current);
79                 m_pObj->get_Value(varIdx,&rgvar[cnt]);
80                 m_current++;
81                 celt--;
82                 cnt++;
83         }
84         // \8eÀ\8dÛ\82É\8f\91\82«\96ß\82µ\82½\92l\82ð\8f\89\8aú\89»\82·\82é
85         if(pceltFetched){
86                 *pceltFetched = cnt;
87         }
88         return (celt > cnt)?S_FALSE:S_OK;
89 }
90
91 template<class T>
92 STDMETHODIMP CComEnumDynaVARIANT<T>::Skip(unsigned long celt)
93 {
94         if(m_pObj){
95                 unsigned long mx  = 0;
96                 m_pObj->get_Count((long*)&mx);
97                 if(m_current + celt < mx){
98                         m_current += celt;
99                         return S_OK;
100                 }
101         }
102         return S_FALSE;
103 }
104
105 template<class T>
106 STDMETHODIMP CComEnumDynaVARIANT<T>::Reset()
107 {
108         m_current = 0;
109         return S_OK;
110 }
111
112 template<class T>
113 STDMETHODIMP CComEnumDynaVARIANT<T>::Clone(IEnumVARIANT FAR* FAR* ppenum)
114 {
115         CComObject< CComEnumDynaVARIANT<T> >* pClone = NULL;
116         pClone->CreateInstance(&pClone);
117         pClone->Init(m_pObj,m_current);
118         pClone->QueryInterface(IID_IEnumVARIANT,(void**)ppenum);
119         return S_OK;
120 }
121
122 #endif