// property.h : Declaration of the CMetaPropertySet #ifndef __PROPERTY_H_ #define __PROPERTY_H_ #define IID_ANY_BSTR 0 #include "resource.h" // main symbols #include "guidedb.h" class CMetaPropertySet; class CMetaPropertySets; class CMetaPropertyType; class CMetaPropertyTypes; class CMetaProperty; class CMetaProperties; class CMetaPropertyCond; class CMetaPropertyCond1Cond; class CMetaPropertyCond2Cond; class CMetaPropertyCondLT; class CMetaPropertyCondLE; class CMetaPropertyCondEQ; class CMetaPropertyCondGE; class CMetaPropertyCondGT; #include "stdprop.h" HRESULT SeekPropsRS(ADODB::_RecordsetPtr prs, boolean fSQLServer, long idObj, long idPropType, boolean fAnyProvider, long idProvider, long idLang); enum PersistFormat { Format_IPersistStream = 0, Format_IPersistPropertyBag }; ///////////////////////////////////////////////////////////////////////////// // CMetaPropertySet class ATL_NO_VTABLE CMetaPropertySet : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: CMetaPropertySet() { #if defined(_ATL_FREE_THREADED) m_pUnkMarshaler = NULL; #endif m_pproptypes = NULL; } DECLARE_REGISTRY_RESOURCEID(IDR_PROPERTYSET) DECLARE_GET_CONTROLLING_UNKNOWN() #if defined(_ATL_FREE_THREADED) DECLARE_PROTECT_FINAL_CONSTRUCT() #endif BEGIN_COM_MAP(CMetaPropertySet) COM_INTERFACE_ENTRY(IMetaPropertySet) COM_INTERFACE_ENTRY(IDispatch) #if defined(_ATL_FREE_THREADED) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) #endif END_COM_MAP() #if defined(_ATL_FREE_THREADED) HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; #endif bool CreatePropTypes(); void Init(CGuideDB *pdb, long id, BSTR bstrName) { m_pdb = pdb; m_id = id; m_bstrName = bstrName; } HRESULT Load(); // IMetaPropertySet public: STDMETHOD(get_MetaPropertyTypes)(/*[out, retval]*/ IMetaPropertyTypes* *ppproptypes); STDMETHOD(get_Name)(/*[out, retval]*/ BSTR *pbstrName); long GetID() { return m_id; } protected: CComPtr m_pdb; long m_id; _bstr_t m_bstrName; CComPtr m_pproptypes; }; // property.h : Declaration of the CMetaPropertySets ///////////////////////////////////////////////////////////////////////////// // CMetaPropertySets class ATL_NO_VTABLE CMetaPropertySets : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: CMetaPropertySets() { #if defined(_ATL_FREE_THREADED) m_pUnkMarshaler = NULL; #endif } HRESULT Init(CGuideDB *pdb) { m_pdb = pdb; return S_OK; } HRESULT Load(); DECLARE_REGISTRY_RESOURCEID(IDR_PROPERTYSETS) DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CMetaPropertySets) COM_INTERFACE_ENTRY(IMetaPropertySets) COM_INTERFACE_ENTRY(IDispatch) #if defined(_ATL_FREE_THREADED) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) #endif END_COM_MAP() #if defined(_ATL_FREE_THREADED) HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; #endif HRESULT Cache(long id, BSTR bstrName, CMetaPropertySet **pppropset); public: // IMetaPropertySets STDMETHOD(get_Lookup)(BSTR bstrName, IMetaPropertyType **ppproptype); STDMETHOD(get_AddNew)(BSTR bstrName, /*[out, retval]*/ IMetaPropertySet **pppropset); STDMETHOD(get_ItemWithName)(BSTR bstrName, /*[out, retval]*/ IMetaPropertySet* *ppropset); STDMETHOD(get_Item)(VARIANT index, /*[out, retval]*/ IMetaPropertySet* *ppropset); STDMETHOD(get_Count)(/*[out, retval]*/ long *plCount); #ifdef IMPLEMENT_NewEnum STDMETHOD(get__NewEnum)(IUnknown **ppunk) { ENTER_API { ValidateOutPtr(ppunk); return E_NOTIMPL; } LEAVE_API } #endif protected: CComPtr m_pdb; typedef map t_map; t_map m_map; }; // property.h : Declaration of the CMetaPropertyType ///////////////////////////////////////////////////////////////////////////// // CMetaPropertyType class DECLSPEC_UUID("67CA8AB9-0A0E-43A8-B9B5-D4D10889A9E6") ATL_NO_VTABLE CMetaPropertyType : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: CMetaPropertyType() { #if defined(_ATL_FREE_THREADED) m_pUnkMarshaler = NULL; #endif } DECLARE_REGISTRY_RESOURCEID(IDR_PROPERTYTYPE) DECLARE_GET_CONTROLLING_UNKNOWN() #if defined(_ATL_FREE_THREADED) DECLARE_PROTECT_FINAL_CONSTRUCT() #endif BEGIN_COM_MAP(CMetaPropertyType) COM_INTERFACE_ENTRY(IMetaPropertyType) COM_INTERFACE_ENTRY(CMetaPropertyType) COM_INTERFACE_ENTRY(IDispatch) #if defined(_ATL_FREE_THREADED) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) #endif END_COM_MAP() #if defined(_ATL_FREE_THREADED) HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; #endif void Init(CGuideDB *pdb, CMetaPropertySet *ppropset, long id, long idPropType, BSTR bstrName) { m_pdb = pdb; m_ppropset = ppropset; m_id = id; m_idPropType = idPropType; m_bstrName = bstrName; } public: long GetID() { return m_id; } STDMETHOD(GetNew)(long idProvider, long lang, VARIANT val, /*[out, retval]*/ IMetaProperty* *ppprop); // IMetaPropertyType STDMETHOD(get_Cond)(BSTR bstrCond, long lang, VARIANT varValue, /*[out, retval]*/ IMetaPropertyCondition* *ppropcond); STDMETHOD(get_New)(long lang, VARIANT val, /*[out, retval]*/ IMetaProperty* *ppprop) { return GetNew(m_pdb->GetIDGuideDataProvider(), lang, val, ppprop); } STDMETHOD(get_Name)(/*[out, retval]*/ BSTR *pVal); STDMETHOD(get_ID)(/*[out, retval]*/ long *pVal); STDMETHOD(get_MetaPropertySet)(/*[out, retval]*/ IMetaPropertySet* *ppropset); //UNDONE: shouldn't be public. CComPtr m_pdb; protected: CComPtr m_ppropset; long m_id; long m_idPropType; _bstr_t m_bstrName; }; // property.h : Declaration of the CMetaPropertyTypes ///////////////////////////////////////////////////////////////////////////// // CMetaPropertyTypes class ATL_NO_VTABLE CMetaPropertyTypes : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: CMetaPropertyTypes() { #if defined(_ATL_FREE_THREADED) m_pUnkMarshaler = NULL; #endif } DECLARE_REGISTRY_RESOURCEID(IDR_PROPERTYTYPES) DECLARE_GET_CONTROLLING_UNKNOWN() #if defined(_ATL_FREE_THREADED) DECLARE_PROTECT_FINAL_CONSTRUCT() #endif BEGIN_COM_MAP(CMetaPropertyTypes) COM_INTERFACE_ENTRY(IMetaPropertyTypes) COM_INTERFACE_ENTRY(IDispatch) #if defined(_ATL_FREE_THREADED) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) #endif END_COM_MAP() #if defined(_ATL_FREE_THREADED) HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; #endif void Init(CGuideDB *pdb, CMetaPropertySet *ppropset) { m_pdb = pdb; m_ppropset = ppropset; } HRESULT Cache(long id, long idPropType, BSTR bstName, CMetaPropertyType **ppproptype); // IMetaPropertyTypes public: STDMETHOD(get_MetaPropertySet)(/*[out, retval]*/ IMetaPropertySet * *pVal); STDMETHOD(get_AddNew)(long id, BSTR bstrName, /*[out, retval]*/ IMetaPropertyType * *pVal); STDMETHOD(get_ItemWithName)(BSTR bstrName, /*[out, retval]*/ IMetaPropertyType* *pproptype); STDMETHOD(get_ItemWithID)(long id, /*[out, retval]*/ IMetaPropertyType* *pproptype); STDMETHOD(get_Item)(VARIANT index, /*[out, retval]*/ IMetaPropertyType* *pproptype); STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); #ifdef IMPLEMENT_NewEnum STDMETHOD(get__NewEnum)(IUnknown **ppunk) { ENTER_API { ValidateOutPtr(ppunk); return E_NOTIMPL; } LEAVE_API } #endif protected: CComPtr m_pdb; CComPtr m_ppropset; typedef map t_map; t_map m_map; }; ///////////////////////////////////////////////////////////////////////////// // CMetaProperty class DECLSPEC_UUID("f23d3b6d-c2a2-4a23-8f54-64cf97c4b6d5") ATL_NO_VTABLE CMetaProperty : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: CMetaProperty() { #if defined(_ATL_FREE_THREADED) m_pUnkMarshaler = NULL; #endif m_idObj = 0; m_idProvider = 0; m_idPropType = 0; m_idLang = 0; } void Init(CGuideDB *pdb, long idPropType, long idProvider, long idLang, VARIANT varValue) { m_pdb = pdb; m_idPropType = idPropType; m_idProvider = idProvider; m_idLang = idLang; m_varValue = varValue; } DECLARE_REGISTRY_RESOURCEID(IDR_PROPERTY) DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CMetaProperty) COM_INTERFACE_ENTRY(IMetaProperty) COM_INTERFACE_ENTRY(CMetaProperty) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY_IID(CLSID_MetaProperty, CMetaProperty) #if defined(_ATL_FREE_THREADED) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) #endif END_COM_MAP() #if defined(_ATL_FREE_THREADED) HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; #endif HRESULT AddNew(ADODB::_RecordsetPtr prs); HRESULT SaveValue(ADODB::_RecordsetPtr prs); HRESULT LoadValue(ADODB::_RecordsetPtr prs); long GetObjectID() { return m_idObj; } HRESULT SetObjectID(long idObj) { if (m_idObj != 0) return E_INVALIDARG; m_idObj = idObj; return S_OK; } STDMETHOD(PutValue)(/*[in]*/ VARIANT varValue); public: STDMETHOD(get_QueryClause)(long &i, TCHAR *szOp, _bstr_t *pbstr); // IMetaProperty STDMETHOD(get_Cond)(BSTR bstrCond, /*[out, retval]*/ IMetaPropertyCondition* *ppropcond); STDMETHOD(get_Value)(/*[out, retval]*/ VARIANT *pvarValue); STDMETHOD(put_Value)(/*[in]*/ VARIANT varValue); STDMETHOD(putref_Value)(/*[in]*/ IUnknown *punk) { VARIANT var; var.vt = VT_UNKNOWN | VT_BYREF; var.ppunkVal = &punk; return put_Value(var); } STDMETHOD(get_GuideDataProvider)(/*[out, retval]*/ IGuideDataProvider **ppprovider) { ENTER_API { ValidateOutPtr(ppprovider, NULL); HRESULT hr; if (m_idProvider == NULL) return S_OK; CComPtr pobjs; hr = m_pdb->get_ObjectsWithType(__uuidof(GuideDataProvider), &pobjs); if (FAILED(hr)) return hr; CComPtr punk; hr = pobjs->get_ItemWithID(m_idProvider, &punk); if (FAILED(hr)) return hr; return punk->QueryInterface(__uuidof(IGuideDataProvider), (void **) ppprovider); } LEAVE_API } STDMETHOD(get_Language)(/*[out, retval]*/ long *pidLang); STDMETHOD(get_MetaPropertyType)(/*[out, retval]*/ IMetaPropertyType* *pproptype); protected: CComPtr m_pdb; long m_idObj; long m_idPropType; long m_idProvider; long m_idLang; _variant_t m_varValue; }; ///////////////////////////////////////////////////////////////////////////// // CMetaProperties class ATL_NO_VTABLE DECLSPEC_UUID("ec6b3b45-5f2c-4c2e-891e-bb1f504b481e") CMetaProperties : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: CMetaProperties() { #if defined(_ATL_FREE_THREADED) m_pUnkMarshaler = NULL; #endif } DECLARE_REGISTRY_RESOURCEID(IDR_PROPERTIES) DECLARE_GET_CONTROLLING_UNKNOWN() #if defined(_ATL_FREE_THREADED) DECLARE_PROTECT_FINAL_CONSTRUCT() #endif BEGIN_COM_MAP(CMetaProperties) COM_INTERFACE_ENTRY(IMetaProperties) COM_INTERFACE_ENTRY(CMetaProperties) COM_INTERFACE_ENTRY(IDispatch) #if defined(_ATL_FREE_THREADED) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) #endif END_COM_MAP() #if defined(_ATL_FREE_THREADED) HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; #endif HRESULT Init(long idObj, long idPropType, CGuideDB *pdb) { m_idObj = idObj; m_idPropType = idPropType; m_pdb = pdb; return S_OK; } HRESULT Load(long idPropType, ADODB::_RecordsetPtr prs, IMetaProperty **ppprop); HRESULT get_AddNew(IMetaPropertyType *pproptype, IGuideDataProvider *pprovider, long lang, VARIANT varValue, /*[out, retval]*/ IMetaProperty * *pVal); HRESULT get_ItemWithTypeProviderLang(IMetaPropertyType *ptype, boolean fAnyProvider, long idProvider, long lang, /*[out, retval]*/ IMetaProperty* *pprop); // IMetaProperties public: STDMETHOD(Add)(IMetaProperty *pprop); STDMETHOD(get_AddNew)(IMetaPropertyType *pproptype, long lang, VARIANT varValue, /*[out, retval]*/ IMetaProperty * *pVal); STDMETHOD(get_ItemsWithMetaPropertyType)(IMetaPropertyType *ptype, /*[out, retval]*/ IMetaProperties* *pprops); STDMETHOD(get_ItemWith)(IMetaPropertyType *ptype, long lang, /*[out, retval]*/ IMetaProperty* *pprop); STDMETHOD(get_ItemWithTypeProviderLang)(IMetaPropertyType *ptype, IGuideDataProvider *pprovider, long lang, /*[out, retval]*/ IMetaProperty* *pprop); STDMETHOD(get_Item)(VARIANT index, /*[out, retval]*/ IMetaProperty* *pprop); STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); #ifdef IMPLEMENT_NewEnum STDMETHOD(get__NewEnum)(IUnknown **ppunk) { ENTER_API { ValidateOutPtr(ppunk); return E_NOTIMPL; } LEAVE_API } #endif protected: CComPtr m_pdb; long m_idObj; long m_idPropType; }; ///////////////////////////////////////////////////////////////////////////// // CMetaPropertyCondition class ATL_NO_VTABLE DECLSPEC_UUID("ec5b84b5-eee5-45a2-88d1-415d21fe7aca") CMetaPropertyCondition : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: CMetaPropertyCondition() { #if defined(_ATL_FREE_THREADED) m_pUnkMarshaler = NULL; #endif } DECLARE_REGISTRY_RESOURCEID(IDR_PROPERTYCONDITION) DECLARE_GET_CONTROLLING_UNKNOWN() #if defined(_ATL_FREE_THREADED) DECLARE_PROTECT_FINAL_CONSTRUCT() #endif BEGIN_COM_MAP(CMetaPropertyCondition) COM_INTERFACE_ENTRY(IMetaPropertyCondition) COM_INTERFACE_ENTRY(CMetaPropertyCondition) COM_INTERFACE_ENTRY(IDispatch) #if defined(_ATL_FREE_THREADED) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) #endif END_COM_MAP() #if defined(_ATL_FREE_THREADED) HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; #endif STDMETHOD(get_QueryClause)(long &i, _bstr_t *pbstr) { return E_FAIL; } // IMetaPropertyCondition public: #if 0 STDMETHOD(get_Not)(/*[out, retval]*/ IMetaPropertyCondition* *ppropcond); #endif STDMETHOD(get_Or)(IMetaPropertyCondition *pcond2, /*[out, retval]*/ IMetaPropertyCondition* *ppropcond); STDMETHOD(get_And)(IMetaPropertyCondition *pcond2, /*[out, retval]*/ IMetaPropertyCondition* *ppropcond); }; class CMetaPropertyCondition1Cond : public CMetaPropertyCondition { public: CMetaPropertyCondition1Cond() { m_szOp = _T(""); } ~CMetaPropertyCondition1Cond() { if (m_ppropcond1 != NULL) m_ppropcond1->Release(); } void Init(IMetaPropertyCondition *ppropcond1) { m_ppropcond1 = ppropcond1; if (m_ppropcond1 != NULL) m_ppropcond1->AddRef(); } protected: STDMETHOD(get_QueryClause)(long &i, _bstr_t *pbstr) { _bstr_t bstr1; CComQIPtr ppropcond1(m_ppropcond1); ppropcond1->get_QueryClause(i, &bstr1); *pbstr = m_szOp + (_T("(") + bstr1 + _T(")")); return S_OK; } protected: IMetaPropertyCondition *m_ppropcond1; TCHAR *m_szOp; }; class CMetaPropertyCondition2Cond : public CMetaPropertyCondition1Cond { public: ~CMetaPropertyCondition2Cond() { if (m_ppropcond2 != NULL) m_ppropcond2->Release(); } void Init(IMetaPropertyCondition *ppropcond1, IMetaPropertyCondition *ppropcond2) { CMetaPropertyCondition1Cond::Init(ppropcond1); m_ppropcond2 = ppropcond2; if (m_ppropcond2 != NULL) m_ppropcond2->AddRef(); } protected: STDMETHOD(get_QueryClause)(long &i, _bstr_t *pbstr) { _bstr_t bstr1; CComQIPtr ppropcond1(m_ppropcond1); ppropcond1->get_QueryClause(i, &bstr1); _bstr_t bstr2; CComQIPtr ppropcond2(m_ppropcond2); ppropcond2->get_QueryClause(i, &bstr2); *pbstr = (_T("(") + bstr1 + _T(")")) + m_szOp + (_T("(") + bstr2 + _T(")")); return S_OK; } protected: IMetaPropertyCondition *m_ppropcond2; }; class CMetaPropertyConditionAnd : public CMetaPropertyCondition2Cond { public: CMetaPropertyConditionAnd() { m_szOp = _T(" AND "); } }; class CMetaPropertyConditionOr : public CMetaPropertyCondition2Cond { public: CMetaPropertyConditionOr() { m_szOp = _T(" OR "); } }; #if 0 class CMetaPropertyConditionNot : public CMetaPropertyCondition1Cond { public: CMetaPropertyConditionNot() { m_szOp = _T("NOT "); } }; #endif class CMetaPropertyCondition1Prop : public CMetaPropertyCondition { public: ~CMetaPropertyCondition1Prop() { if (m_pprop != NULL) m_pprop->Release(); } void Init(IMetaProperty *pprop) { m_pprop = pprop; if (m_pprop != NULL) m_pprop->AddRef(); } STDMETHOD(get_QueryClause)(long &i, _bstr_t *pbstr) { _bstr_t bstr1; CComQIPtr pprop(m_pprop); return pprop->get_QueryClause(i, m_szOp, pbstr); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) = 0; protected: TCHAR * m_szOp; IMetaProperty *m_pprop; }; inline int VariantCompare(VARIANT & var1, VARIANT & var2) { switch(VarCmp(&var1, &var2, LOCALE_USER_DEFAULT, 0)) { case VARCMP_EQ: return 0; case VARCMP_LT: return -1; case VARCMP_GT: return 1; case VARCMP_NULL: return -1; } return -1; } class CMetaPropertyConditionEQ : public CMetaPropertyCondition1Prop { public: CMetaPropertyConditionEQ() { m_szOp = _T(" = "); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) { return (VariantCompare(var1, var2) == 0); } }; class CMetaPropertyConditionNE : public CMetaPropertyCondition1Prop { public: CMetaPropertyConditionNE() { m_szOp = _T(" <> "); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) { return (VariantCompare(var1, var2) != 0); } }; class CMetaPropertyConditionLike : public CMetaPropertyCondition1Prop { public: CMetaPropertyConditionLike() { m_szOp = _T(" LIKE "); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) { return FALSE; //UNDONE } }; class CMetaPropertyConditionNotLike : public CMetaPropertyCondition1Prop { public: CMetaPropertyConditionNotLike() { m_szOp = _T(" NOT LIKE "); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) { return FALSE; //UNDONE } }; class CMetaPropertyConditionLT : public CMetaPropertyCondition1Prop { public: CMetaPropertyConditionLT() { m_szOp = _T(" < "); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) { return (VariantCompare(var1, var2) > 0); } }; class CMetaPropertyConditionLE : public CMetaPropertyCondition1Prop { public: CMetaPropertyConditionLE() { m_szOp = _T(" <= "); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) { return (VariantCompare(var1, var2) <= 0); } }; class CMetaPropertyConditionGT : public CMetaPropertyCondition1Prop { public: CMetaPropertyConditionGT() { m_szOp = _T(" > "); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) { return (VariantCompare(var1, var2) > 0); } }; class CMetaPropertyConditionGE : public CMetaPropertyCondition1Prop { public: CMetaPropertyConditionGE() { m_szOp = _T(" >= "); } virtual BOOL FCompare(VARIANT var1, VARIANT var2) { return (VariantCompare(var1, var2) >= 0); } }; #endif //__PROPERTY_H_