#ifndef __WSBDATE_H__ #define __WSBDATE_H__ #include "time.h" // WSBAPI is used on global public functions #ifndef WSBAPI #define WSBAPI __stdcall #endif // #ifdef _WSB_NO_WSB_SUPPORT // #error WSB classes not supported in this library variant. // #endif // // #ifndef __WSBWIN_H__ // #include // #endif // // // include necessary WSB headers // #ifndef _OBJBASE_H_ // #include // #endif // #ifndef _WSBAUTO_H_ // #include // #endif // #ifndef _WSBCTL_H_ // #include // #endif // //REVIEW: This header has no symbol to prevent repeated includes // #include // #ifndef __ocidl_h__ // #include // #endif // // #ifdef _WSB_MINREBUILD // #pragma component(minrebuild, off) // #endif // #ifndef _WSB_FULLTYPEINFO // #pragma component(mintypeinfo, on) // #endif // // #ifndef _WSB_NOFORCE_LIBS // #ifndef _MAC // // ///////////////////////////////////////////////////////////////////////////// // // Win32 libraries // // #ifdef _WSBDLL // #if defined(_DEBUG) && !defined(_WSB_MONOLITHIC) // #ifndef _UNICODE // #pragma comment(lib, "mfco42d.lib") // #else // #pragma comment(lib, "mfco42ud.lib") // #endif // #endif // #endif // // #pragma comment(lib, "oledlg.lib") // #pragma comment(lib, "ole32.lib") // #pragma comment(lib, "olepro32.lib") // #pragma comment(lib, "oleaut32.lib") // #pragma comment(lib, "uuid.lib") // #pragma comment(lib, "urlmon.lib") // // #else //!_MAC // // ///////////////////////////////////////////////////////////////////////////// // // Mac libraries // // #ifdef _WSBDLL // #ifdef _DEBUG // #pragma comment(lib, "mfco42pd.lib") // #else // #pragma comment(lib, "mfco42p.lib") // #endif // #endif // // #if !defined(_WSBDLL) && !defined(_USRDLL) // #ifdef _DEBUG // #pragma comment(lib, "wlmoled.lib") // #pragma comment(lib, "ole2uid.lib") // #else // #pragma comment(lib, "wlmole.lib") // #pragma comment(lib, "ole2ui.lib") // #endif // #pragma comment(linker, "/macres:ole2ui.rsc") // #else // #ifdef _DEBUG // #pragma comment(lib, "oledlgd.lib") // #pragma comment(lib, "msvcoled.lib") // #else // #pragma comment(lib, "oledlg.lib") // #pragma comment(lib, "msvcole.lib") // #endif // #endif // // #pragma comment(lib, "uuid.lib") // // #ifdef _DEBUG // #pragma comment(lib, "ole2d.lib") // #pragma comment(lib, "ole2autd.lib") // #else // #pragma comment(lib, "ole2.lib") // #pragma comment(lib, "ole2auto.lib") // #endif // // #endif //_MAC // #endif //!_WSB_NOFORCE_LIBS // // ///////////////////////////////////////////////////////////////////////////// // // #ifdef _WSB_PACKING // #pragma pack(push, _WSB_PACKING) // #endif // // ///////////////////////////////////////////////////////////////////////////// // // WSBDATE - MFC IDispatch & ClassFactory support // // // Classes declared in this file // // //CCmdTarget // class CWsbObjectFactory; // glue for IClassFactory -> runtime class // class CWsbTemplateServer; // server documents using CDocTemplate // // class CWsbDispatchDriver; // helper class to call IDispatch // class CWsbCurrency; // Based on OLE CY // class CWsbSafeArray; // Based on WSB VARIANT // //CException // class CWsbException; // caught by client or server // class CWsbDispatchException; // special exception for IDispatch calls class CWsbDVariant; // WSB VARIANT wrapper class CWsbDateTime; // Based on WSB DATE class CWsbDateTimeSpan; // Based on a double ///////////////////////////////////////////////////////////////////////////// // // WSBDLL support // #undef WSB_DATA // #define WSB_DATA WSB_DATA // // ///////////////////////////////////////////////////////////////////////////// // // WSB COM (Component Object Model) implementation infrastructure // // - data driven QueryInterface // // - standard implementation of aggregate AddRef and Release // // (see CCmdTarget in WSBWIN.H for more information) // // #define METHOD_PROLOGUE(theClass, localClass) \ // theClass* pThis = \ // ((theClass*)((BYTE*)this - offsetof(theClass, m_x##localClass))); \ // WSB_MANAGE_STATE(pThis->m_pModuleState) \ // // #define METHOD_PROLOGUE_(theClass, localClass) \ // theClass* pThis = \ // ((theClass*)((BYTE*)this - offsetof(theClass, m_x##localClass))); \ // // #ifndef _WSB_NO_NESTED_DERIVATION // #define METHOD_PROLOGUE_EX(theClass, localClass) \ // theClass* pThis = ((theClass*)((BYTE*)this - m_nOffset)); \ // WSB_MANAGE_STATE(pThis->m_pModuleState) \ // // #define METHOD_PROLOGUE_EX_(theClass, localClass) \ // theClass* pThis = ((theClass*)((BYTE*)this - m_nOffset)); \ // // #else // #define METHOD_PROLOGUE_EX(theClass, localClass) \ // METHOD_PROLOGUE(theClass, localClass) \ // // #define METHOD_PROLOGUE_EX_(theClass, localClass) \ // METHOD_PROLOGUE_(theClass, localClass) \ // // #endif // // // Provided only for compatibility with CDK 1.x // #define METHOD_MANAGE_STATE(theClass, localClass) \ // METHOD_PROLOGUE_EX(theClass, localClass) \ // // #define BEGIN_INTERFACE_PART(localClass, baseClass) \ // class X##localClass : public baseClass \ // { \ // public: \ // STDMETHOD_(ULONG, AddRef)(); \ // STDMETHOD_(ULONG, Release)(); \ // STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppvObj); \ // // #ifndef _WSB_NO_NESTED_DERIVATION // #define BEGIN_INTERFACE_PART_DERIVE(localClass, baseClass) \ // class X##localClass : public baseClass \ // { \ // public: \ // // #else // #define BEGIN_INTERFACE_PART_DERIVE(localClass, baseClass) \ // BEGIN_INTERFACE_PART(localClass, baseClass) \ // // #endif // // #ifndef _WSB_NO_NESTED_DERIVATION // #define INIT_INTERFACE_PART(theClass, localClass) \ // size_t m_nOffset; \ // INIT_INTERFACE_PART_DERIVE(theClass, localClass) \ // // #define INIT_INTERFACE_PART_DERIVE(theClass, localClass) \ // X##localClass() \ // { m_nOffset = offsetof(theClass, m_x##localClass); } \ // // #else // #define INIT_INTERFACE_PART(theClass, localClass) // #define INIT_INTERFACE_PART_DERIVE(theClass, localClass) // // #endif // // // Note: Inserts the rest of WSB functionality between these two macros, // // depending upon the interface that is being implemented. It is not // // necessary to include AddRef, Release, and QueryInterface since those // // member functions are declared by the macro. // // #define END_INTERFACE_PART(localClass) \ // } m_x##localClass; \ // friend class X##localClass; \ // // #ifdef _WSBDLL // #define BEGIN_INTERFACE_MAP(theClass, theBase) \ // const WSB_INTERFACEMAP* PASCAL theClass::_GetBaseInterfaceMap() \ // { return &theBase::interfaceMap; } \ // const WSB_INTERFACEMAP* theClass::GetInterfaceMap() const \ // { return &theClass::interfaceMap; } \ // const WSB_DATADEF WSB_INTERFACEMAP theClass::interfaceMap = \ // { &theClass::_GetBaseInterfaceMap, &theClass::_interfaceEntries[0], }; \ // const WSB_DATADEF WSB_INTERFACEMAP_ENTRY theClass::_interfaceEntries[] = \ // { \ // // #else // #define BEGIN_INTERFACE_MAP(theClass, theBase) \ // const WSB_INTERFACEMAP* theClass::GetInterfaceMap() const \ // { return &theClass::interfaceMap; } \ // const WSB_DATADEF WSB_INTERFACEMAP theClass::interfaceMap = \ // { &theBase::interfaceMap, &theClass::_interfaceEntries[0], }; \ // const WSB_DATADEF WSB_INTERFACEMAP_ENTRY theClass::_interfaceEntries[] = \ // { \ // // #endif // // #define INTERFACE_PART(theClass, iid, localClass) \ // { &iid, offsetof(theClass, m_x##localClass) }, \ // // #define INTERFACE_AGGREGATE(theClass, theAggr) \ // { NULL, offsetof(theClass, theAggr) }, \ // // #define END_INTERFACE_MAP() \ // { NULL, (size_t)-1 } \ // }; \ // ///////////////////////////////////////////////////////////////////////////// // // CWsbException - unexpected or rare WSB error returned // // class CWsbException : public CException // { // DECLARE_DYNAMIC(CWsbException) // // public: // SCODE m_sc; // static SCODE PASCAL Process(const CException* pAnyException); // // // Implementation (use WsbThrowWsbException to create) // public: // CWsbException(); // virtual ~CWsbException(); // // virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, // PUINT pnHelpContext = NULL); // }; // // void WSBAPI WsbThrowWsbException(SCODE sc); // ///////////////////////////////////////////////////////////////////////////// // // IDispatch specific exception // // class CWsbDispatchException : public CException // { // DECLARE_DYNAMIC(CWsbDispatchException) // // public: // // Attributes // WORD m_wCode; // error code (specific to IDispatch implementation) // CString m_strDescription; // human readable description of the error // DWORD m_dwHelpContext; // help context for error // // // usually empty in application which creates it (eg. servers) // CString m_strHelpFile; // help file to use with m_dwHelpContext // CString m_strSource; // source of the error (name of server) // // // Implementation // public: // CWsbDispatchException(LPCTSTR lpszDescription, UINT nHelpID, WORD wCode); // virtual ~CWsbDispatchException(); // static void PASCAL Process( // EXCEPINFO* pInfo, const CException* pAnyException); // // virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, // PUINT pnHelpContext = NULL); // // SCODE m_scError; // SCODE describing the error // }; // // void WSBAPI WsbThrowWsbDispatchException(WORD wCode, LPCTSTR lpszDescription, // UINT nHelpID = 0); // void WSBAPI WsbThrowWsbDispatchException(WORD wCode, UINT nDescriptionID, // UINT nHelpID = (UINT)-1); // ///////////////////////////////////////////////////////////////////////////// // // Macros for CCmdTarget IDispatchable classes // // #ifdef _WSBDLL // #define BEGIN_DISPATCH_MAP(theClass, baseClass) \ // const WSB_DISPMAP* PASCAL theClass::_GetBaseDispatchMap() \ // { return &baseClass::dispatchMap; } \ // const WSB_DISPMAP* theClass::GetDispatchMap() const \ // { return &theClass::dispatchMap; } \ // const WSB_DISPMAP theClass::dispatchMap = \ // { &theClass::_GetBaseDispatchMap, &theClass::_dispatchEntries[0], \ // &theClass::_dispatchEntryCount, &theClass::_dwStockPropMask }; \ // UINT theClass::_dispatchEntryCount = (UINT)-1; \ // DWORD theClass::_dwStockPropMask = (DWORD)-1; \ // const WSB_DISPMAP_ENTRY theClass::_dispatchEntries[] = \ // { \ // // #else // #define BEGIN_DISPATCH_MAP(theClass, baseClass) \ // const WSB_DISPMAP* theClass::GetDispatchMap() const \ // { return &theClass::dispatchMap; } \ // const WSB_DISPMAP theClass::dispatchMap = \ // { &baseClass::dispatchMap, &theClass::_dispatchEntries[0], \ // &theClass::_dispatchEntryCount, &theClass::_dwStockPropMask }; \ // UINT theClass::_dispatchEntryCount = (UINT)-1; \ // DWORD theClass::_dwStockPropMask = (DWORD)-1; \ // const WSB_DISPMAP_ENTRY theClass::_dispatchEntries[] = \ // { \ // // #endif // // #define END_DISPATCH_MAP() \ // { VTS_NONE, DISPID_UNKNOWN, VTS_NONE, VT_VOID, \ // (WSB_PMSG)NULL, (WSB_PMSG)NULL, (size_t)-1, afxDispCustom } }; \ // // // parameter types: by value VTs // #define VTS_I2 "\x02" // a 'short' // #define VTS_I4 "\x03" // a 'long' // #define VTS_R4 "\x04" // a 'float' // #define VTS_R8 "\x05" // a 'double' // #define VTS_CY "\x06" // a 'CY' or 'CY*' // #define VTS_DATE "\x07" // a 'DATE' // #define VTS_WBSTR "\x08" // an 'LPCWSBSTR' // #define VTS_DISPATCH "\x09" // an 'IDispatch*' // #define VTS_SCODE "\x0A" // an 'SCODE' // #define VTS_BOOL "\x0B" // a 'BOOL' // #define VTS_VARIANT "\x0C" // a 'const VARIANT&' or 'VARIANT*' // #define VTS_UNKNOWN "\x0D" // an 'IUnknown*' // #if defined(_UNICODE) || defined(WSB2ANSI) // #define VTS_BSTR VTS_WBSTR// an 'LPCWSBSTR' // #define VT_BSTRT VT_BSTR // #else // #define VTS_BSTR "\x0E" // an 'LPCSTR' // #define VT_BSTRA 14 // #define VT_BSTRT VT_BSTRA // #endif // // // parameter types: by reference VTs // #define VTS_PI2 "\x42" // a 'short*' // #define VTS_PI4 "\x43" // a 'long*' // #define VTS_PR4 "\x44" // a 'float*' // #define VTS_PR8 "\x45" // a 'double*' // #define VTS_PCY "\x46" // a 'CY*' // #define VTS_PDATE "\x47" // a 'DATE*' // #define VTS_PBSTR "\x48" // a 'BSTR*' // #define VTS_PDISPATCH "\x49" // an 'IDispatch**' // #define VTS_PSCODE "\x4A" // an 'SCODE*' // #define VTS_PBOOL "\x4B" // a 'VARIANT_BOOL*' // #define VTS_PVARIANT "\x4C" // a 'VARIANT*' // #define VTS_PUNKNOWN "\x4D" // an 'IUnknown**' // // // special VT_ and VTS_ values // #define VTS_NONE NULL // used for members with 0 params // #define VT_MFCVALUE 0xFFF // special value for DISPID_VALUE // #define VT_MFCBYREF 0x40 // indicates VT_BYREF type // #define VT_MFCMARKER 0xFF // delimits named parameters (INTERNAL USE) // // // variant handling (use V_BSTRT when you have ANSI BSTRs, as in DAO) // #ifndef _UNICODE // #define V_BSTRT(b) (LPSTR)V_BSTR(b) // #else // #define V_BSTRT(b) V_BSTR(b) // #endif // // ///////////////////////////////////////////////////////////////////////////// // // WSB control parameter types // // #define VTS_COLOR VTS_I4 // WSB_COLOR // #define VTS_XPOS_PIXELS VTS_I4 // WSB_XPOS_PIXELS // #define VTS_YPOS_PIXELS VTS_I4 // WSB_YPOS_PIXELS // #define VTS_XSIZE_PIXELS VTS_I4 // WSB_XSIZE_PIXELS // #define VTS_YSIZE_PIXELS VTS_I4 // WSB_YSIZE_PIXELS // #define VTS_XPOS_HIMETRIC VTS_I4 // WSB_XPOS_HIMETRIC // #define VTS_YPOS_HIMETRIC VTS_I4 // WSB_YPOS_HIMETRIC // #define VTS_XSIZE_HIMETRIC VTS_I4 // WSB_XSIZE_HIMETRIC // #define VTS_YSIZE_HIMETRIC VTS_I4 // WSB_YSIZE_HIMETRIC // #define VTS_TRISTATE VTS_I2 // WSB_TRISTATE // #define VTS_OPTEXCLUSIVE VTS_BOOL // WSB_OPTEXCLUSIVE // // #define VTS_PCOLOR VTS_PI4 // WSB_COLOR* // #define VTS_PXPOS_PIXELS VTS_PI4 // WSB_XPOS_PIXELS* // #define VTS_PYPOS_PIXELS VTS_PI4 // WSB_YPOS_PIXELS* // #define VTS_PXSIZE_PIXELS VTS_PI4 // WSB_XSIZE_PIXELS* // #define VTS_PYSIZE_PIXELS VTS_PI4 // WSB_YSIZE_PIXELS* // #define VTS_PXPOS_HIMETRIC VTS_PI4 // WSB_XPOS_HIMETRIC* // #define VTS_PYPOS_HIMETRIC VTS_PI4 // WSB_YPOS_HIMETRIC* // #define VTS_PXSIZE_HIMETRIC VTS_PI4 // WSB_XSIZE_HIMETRIC* // #define VTS_PYSIZE_HIMETRIC VTS_PI4 // WSB_YSIZE_HIMETRIC* // #define VTS_PTRISTATE VTS_PI2 // WSB_TRISTATE* // #define VTS_POPTEXCLUSIVE VTS_PBOOL // WSB_OPTEXCLUSIVE* // // #define VTS_FONT VTS_DISPATCH // IFontDispatch* // #define VTS_PICTURE VTS_DISPATCH // IPictureDispatch* // // #define VTS_HANDLE VTS_I4 // WSB_HANDLE // #define VTS_PHANDLE VTS_PI4 // WSB_HANDLE* // // // these DISP_ macros cause the framework to generate the DISPID // #define DISP_FUNCTION(theClass, szExternalName, pfnMember, vtRetVal, vtsParams) \ // { _T(szExternalName), DISPID_UNKNOWN, vtsParams, vtRetVal, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnMember, (WSB_PMSG)0, 0, \ // afxDispCustom }, \ // // #define DISP_PROPERTY(theClass, szExternalName, memberName, vtPropType) \ // { _T(szExternalName), DISPID_UNKNOWN, NULL, vtPropType, (WSB_PMSG)0, (WSB_PMSG)0, \ // offsetof(theClass, memberName), afxDispCustom }, \ // // #define DISP_PROPERTY_NOTIFY(theClass, szExternalName, memberName, pfnAfterSet, vtPropType) \ // { _T(szExternalName), DISPID_UNKNOWN, NULL, vtPropType, (WSB_PMSG)0, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnAfterSet, \ // offsetof(theClass, memberName), afxDispCustom }, \ // // #define DISP_PROPERTY_EX(theClass, szExternalName, pfnGet, pfnSet, vtPropType) \ // { _T(szExternalName), DISPID_UNKNOWN, NULL, vtPropType, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnGet, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispCustom }, \ // // #define DISP_PROPERTY_PARAM(theClass, szExternalName, pfnGet, pfnSet, vtPropType, vtsParams) \ // { _T(szExternalName), DISPID_UNKNOWN, vtsParams, vtPropType, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnGet, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispCustom }, \ // // // these DISP_ macros allow the app to determine the DISPID // #define DISP_FUNCTION_ID(theClass, szExternalName, dispid, pfnMember, vtRetVal, vtsParams) \ // { _T(szExternalName), dispid, vtsParams, vtRetVal, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnMember, (WSB_PMSG)0, 0, \ // afxDispCustom }, \ // // #define DISP_PROPERTY_ID(theClass, szExternalName, dispid, memberName, vtPropType) \ // { _T(szExternalName), dispid, NULL, vtPropType, (WSB_PMSG)0, (WSB_PMSG)0, \ // offsetof(theClass, memberName), afxDispCustom }, \ // // #define DISP_PROPERTY_NOTIFY_ID(theClass, szExternalName, dispid, memberName, pfnAfterSet, vtPropType) \ // { _T(szExternalName), dispid, NULL, vtPropType, (WSB_PMSG)0, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnAfterSet, \ // offsetof(theClass, memberName), afxDispCustom }, \ // // #define DISP_PROPERTY_EX_ID(theClass, szExternalName, dispid, pfnGet, pfnSet, vtPropType) \ // { _T(szExternalName), dispid, NULL, vtPropType, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnGet, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispCustom }, \ // // #define DISP_PROPERTY_PARAM_ID(theClass, szExternalName, dispid, pfnGet, pfnSet, vtPropType, vtsParams) \ // { _T(szExternalName), dispid, vtsParams, vtPropType, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnGet, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispCustom }, \ // // // the DISP_DEFVALUE is a special case macro that creates an alias for DISPID_VALUE // #define DISP_DEFVALUE(theClass, szExternalName) \ // { _T(szExternalName), DISPID_UNKNOWN, NULL, VT_MFCVALUE, \ // (WSB_PMSG)0, (WSB_PMSG)0, 0, afxDispCustom }, \ // // #define DISP_DEFVALUE_ID(theClass, dispid) \ // { NULL, dispid, NULL, VT_MFCVALUE, (WSB_PMSG)0, (WSB_PMSG)0, 0, \ // afxDispCustom }, \ // // ///////////////////////////////////////////////////////////////////////////// // // Macros for creating "creatable" automation classes. // // #define DECLARE_WSBCREATE(class_name) \ // public: \ // static WSB_DATA CWsbObjectFactory factory; \ // static WSB_DATA const GUID guid; \ // // #define IMPLEMENT_WSBCREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ // WSB_DATADEF CWsbObjectFactory class_name::factory(class_name::guid, \ // RUNTIME_CLASS(class_name), FALSE, _T(external_name)); \ // const WSB_DATADEF GUID class_name::guid = \ // { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }; \ // // ///////////////////////////////////////////////////////////////////////////// // // Helper class for driving IDispatch // // class CWsbDispatchDriver // { // // Constructors // public: // CWsbDispatchDriver(); // CWsbDispatchDriver(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE); // CWsbDispatchDriver(const CWsbDispatchDriver& dispatchSrc); // // // Attributes // LPDISPATCH m_lpDispatch; // BOOL m_bAutoRelease; // // // Operations // BOOL CreateDispatch(REFCLSID clsid, CWsbException* pError = NULL); // BOOL CreateDispatch(LPCTSTR lpszProgID, CWsbException* pError = NULL); // // void AttachDispatch(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE); // LPDISPATCH DetachDispatch(); // // detach and get ownership of m_lpDispatch // void ReleaseDispatch(); // // // helpers for IDispatch::Invoke // void WSB_CDECL InvokeHelper(DISPID dwDispID, WORD wFlags, // VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...); // void WSB_CDECL SetProperty(DISPID dwDispID, VARTYPE vtProp, ...); // void GetProperty(DISPID dwDispID, VARTYPE vtProp, void* pvProp) const; // // // special operators // operator LPDISPATCH(); // const CWsbDispatchDriver& operator=(const CWsbDispatchDriver& dispatchSrc); // // // Implementation // public: // ~CWsbDispatchDriver(); // void InvokeHelperV(DISPID dwDispID, WORD wFlags, VARTYPE vtRet, // void* pvRet, const BYTE* pbParamInfo, va_list argList); // }; // // ///////////////////////////////////////////////////////////////////////////// // // Class Factory implementation (binds WSB class factory -> runtime class) // // (all specific class factories derive from this class factory) // // class CWsbObjectFactory : public CCmdTarget // { // DECLARE_DYNAMIC(CWsbObjectFactory) // // // Construction // public: // CWsbObjectFactory(REFCLSID clsid, CRuntimeClass* pRuntimeClass, // BOOL bMultiInstance, LPCTSTR lpszProgID); // // // Attributes // virtual BOOL IsRegistered() const; // REFCLSID GetClassID() const; // // // Operations // virtual BOOL Register(); // void Revoke(); // void UpdateRegistry(LPCTSTR lpszProgID = NULL); // // default uses m_lpszProgID if not NULL // BOOL IsLicenseValid(); // // static BOOL PASCAL RegisterAll(); // static void PASCAL RevokeAll(); // static BOOL PASCAL UpdateRegistryAll(BOOL bRegister = TRUE); // // // Overridables // protected: // virtual CCmdTarget* OnCreateObject(); // virtual BOOL UpdateRegistry(BOOL bRegister); // virtual BOOL VerifyUserLicense(); // virtual BOOL GetLicenseKey(DWORD dwReserved, BSTR* pbstrKey); // virtual BOOL VerifyLicenseKey(BSTR bstrKey); // // // Implementation // public: // virtual ~CWsbObjectFactory(); // #ifdef _DEBUG // void AssertValid() const; // void Dump(CDumpContext& dc) const; // #endif // // public: // CWsbObjectFactory* m_pNextFactory; // list of factories maintained // // protected: // DWORD m_dwRegister; // registry identifier // CLSID m_clsid; // registered class ID // CRuntimeClass* m_pRuntimeClass; // runtime class of CCmdTarget derivative // BOOL m_bMultiInstance; // multiple instance? // LPCTSTR m_lpszProgID; // human readable class ID // BYTE m_bLicenseChecked; // BYTE m_bLicenseValid; // BYTE m_bRegistered; // is currently registered w/ system // BYTE m_bReserved; // reserved for future use // // // Interface Maps // public: // BEGIN_INTERFACE_PART(ClassFactory, IClassFactory2) // INIT_INTERFACE_PART(CWsbObjectFactory, ClassFactory) // STDMETHOD(CreateInstance)(LPUNKNOWN, REFIID, LPVOID*); // STDMETHOD(LockServer)(BOOL); // STDMETHOD(GetLicInfo)(LPLICINFO); // STDMETHOD(RequestLicKey)(DWORD, BSTR*); // STDMETHOD(CreateInstanceLic)(LPUNKNOWN, LPUNKNOWN, REFIID, BSTR, // LPVOID*); // END_INTERFACE_PART(ClassFactory) // // DECLARE_INTERFACE_MAP() // // friend SCODE WSBAPI WsbDllGetClassObject(REFCLSID, REFIID, LPVOID*); // friend SCODE STDAPICALLTYPE DllGetClassObject(REFCLSID, REFIID, LPVOID*); // }; // // // Define CWsbObjectFactoryEx for compatibility with old CDK // #define CWsbObjectFactoryEx CWsbObjectFactory // // ////////////////////////////////////////////////////////////////////////////// // // CWsbTemplateServer - CWsbObjectFactory using CDocTemplates // // // This enumeration is used in WsbWsbRegisterServerClass to pick the // // correct registration entries given the application type. // enum WSB_APPTYPE // { // OAT_INPLACE_SERVER = 0, // server has full server user-interface // OAT_SERVER = 1, // server supports only embedding // OAT_CONTAINER = 2, // container supports links to embeddings // OAT_DISPATCH_OBJECT = 3, // IDispatch capable object // OAT_DOC_OBJECT_SERVER = 4, // sever supports DocObject embedding // OAT_DOC_OBJECT_CONTAINER =5,// container supports DocObject clients // }; // // class CWsbTemplateServer : public CWsbObjectFactory // { // // Constructors // public: // CWsbTemplateServer(); // // // Operations // void ConnectTemplate(REFCLSID clsid, CDocTemplate* pDocTemplate, // BOOL bMultiInstance); // // set doc template after creating it in InitInstance // void UpdateRegistry(WSB_APPTYPE nAppType = OAT_INPLACE_SERVER, // LPCTSTR* rglpszRegister = NULL, LPCTSTR* rglpszOverwrite = NULL); // // may want to UpdateRegistry if not run with /Embedded // BOOL Register(); // // // Implementation // protected: // virtual CCmdTarget* OnCreateObject(); // CDocTemplate* m_pDocTemplate; // // private: // void UpdateRegistry(LPCTSTR lpszProgID); // // hide base class version of UpdateRegistry // }; // // ///////////////////////////////////////////////////////////////////////////// // // System registry helpers // // // Helper to register server in case of no .REG file loaded // BOOL WSBAPI WsbWsbRegisterServerClass( // REFCLSID clsid, LPCTSTR lpszClassName, // LPCTSTR lpszShortTypeName, LPCTSTR lpszLongTypeName, // WSB_APPTYPE nAppType = OAT_SERVER, // LPCTSTR* rglpszRegister = NULL, LPCTSTR* rglpszOverwrite = NULL, // int nIconIndex = 0, LPCTSTR lpszLocalFilterName = NULL); // // // WsbWsbRegisterHelper is a worker function used by WsbWsbRegisterServerClass // // (available for advanced registry work) // BOOL WSBAPI WsbWsbRegisterHelper(LPCTSTR const* rglpszRegister, // LPCTSTR const* rglpszSymbols, int nSymbols, BOOL bReplace, // HKEY hKeyRoot = ((HKEY)0x80000000)); // HKEY_CLASSES_ROOT // // ///////////////////////////////////////////////////////////////////////////// // // Connection maps // // #define BEGIN_CONNECTION_PART(theClass, localClass) \ // class X##localClass : public CConnectionPoint \ // { \ // public: \ // X##localClass() \ // { m_nOffset = offsetof(theClass, m_x##localClass); } // // #define CONNECTION_IID(iid) \ // REFIID GetIID() { return iid; } // // #define END_CONNECTION_PART(localClass) \ // } m_x##localClass; \ // friend class X##localClass; // // #ifdef _WSBDLL // #define BEGIN_CONNECTION_MAP(theClass, theBase) \ // const WSB_CONNECTIONMAP* PASCAL theClass::_GetBaseConnectionMap() \ // { return &theBase::connectionMap; } \ // const WSB_CONNECTIONMAP* theClass::GetConnectionMap() const \ // { return &theClass::connectionMap; } \ // const WSB_DATADEF WSB_CONNECTIONMAP theClass::connectionMap = \ // { &theClass::_GetBaseConnectionMap, &theClass::_connectionEntries[0], }; \ // const WSB_DATADEF WSB_CONNECTIONMAP_ENTRY theClass::_connectionEntries[] = \ // { \ // // #else // #define BEGIN_CONNECTION_MAP(theClass, theBase) \ // const WSB_CONNECTIONMAP* theClass::GetConnectionMap() const \ // { return &theClass::connectionMap; } \ // const WSB_DATADEF WSB_CONNECTIONMAP theClass::connectionMap = \ // { &(theBase::connectionMap), &theClass::_connectionEntries[0], }; \ // const WSB_DATADEF WSB_CONNECTIONMAP_ENTRY theClass::_connectionEntries[] = \ // { \ // // #endif // // #define CONNECTION_PART(theClass, iid, localClass) \ // { &iid, offsetof(theClass, m_x##localClass) }, \ // // #define END_CONNECTION_MAP() \ // { NULL, (size_t)-1 } \ // }; \ // // ///////////////////////////////////////////////////////////////////////////// // // CConnectionPoint // // class CConnectionPoint : public CCmdTarget // { // // Constructors // public: // CConnectionPoint(); // // // Operations // POSITION GetStartPosition() const; // LPUNKNOWN GetNextConnection(POSITION& pos) const; // const CPtrArray* GetConnections(); // obsolete // // // Overridables // virtual LPCONNECTIONPOINTCONTAINER GetContainer(); // virtual REFIID GetIID() = 0; // virtual void OnAdvise(BOOL bAdvise); // virtual int GetMaxConnections(); // virtual LPUNKNOWN QuerySinkInterface(LPUNKNOWN pUnkSink); // // // Implementation // ~CConnectionPoint(); // void CreateConnectionArray(); // int GetConnectionCount(); // // protected: // size_t m_nOffset; // LPUNKNOWN m_pUnkFirstConnection; // CPtrArray* m_pConnections; // // // Interface Maps // public: // BEGIN_INTERFACE_PART(ConnPt, IConnectionPoint) // INIT_INTERFACE_PART(CConnectionPoint, ConnPt) // STDMETHOD(GetConnectionInterface)(IID* pIID); // STDMETHOD(GetConnectionPointContainer)( // IConnectionPointContainer** ppCPC); // STDMETHOD(Advise)(LPUNKNOWN pUnkSink, DWORD* pdwCookie); // STDMETHOD(Unadvise)(DWORD dwCookie); // STDMETHOD(EnumConnections)(LPENUMCONNECTIONS* ppEnum); // END_INTERFACE_PART(ConnPt) // }; // // ///////////////////////////////////////////////////////////////////////////// // // EventSink Maps // // #ifndef _WSB_NO_OCC_SUPPORT // // #ifdef _WSBDLL // #define BEGIN_EVENTSINK_MAP(theClass, baseClass) \ // const WSB_EVENTSINKMAP* PASCAL theClass::_GetBaseEventSinkMap() \ // { return &baseClass::eventsinkMap; } \ // const WSB_EVENTSINKMAP* theClass::GetEventSinkMap() const \ // { return &theClass::eventsinkMap; } \ // const WSB_EVENTSINKMAP theClass::eventsinkMap = \ // { &theClass::_GetBaseEventSinkMap, &theClass::_eventsinkEntries[0], \ // &theClass::_eventsinkEntryCount }; \ // UINT theClass::_eventsinkEntryCount = (UINT)-1; \ // const WSB_EVENTSINKMAP_ENTRY theClass::_eventsinkEntries[] = \ // { \ // // #else // #define BEGIN_EVENTSINK_MAP(theClass, baseClass) \ // const WSB_EVENTSINKMAP* theClass::GetEventSinkMap() const \ // { return &theClass::eventsinkMap; } \ // const WSB_EVENTSINKMAP theClass::eventsinkMap = \ // { &baseClass::eventsinkMap, &theClass::_eventsinkEntries[0], \ // &theClass::_eventsinkEntryCount }; \ // UINT theClass::_eventsinkEntryCount = (UINT)-1; \ // const WSB_EVENTSINKMAP_ENTRY theClass::_eventsinkEntries[] = \ // { \ // // #endif // // #define END_EVENTSINK_MAP() \ // { VTS_NONE, DISPID_UNKNOWN, VTS_NONE, VT_VOID, \ // (WSB_PMSG)NULL, (WSB_PMSG)NULL, (size_t)-1, afxDispCustom, \ // (UINT)-1, 0 } }; \ // // #define ON_EVENT(theClass, id, dispid, pfnHandler, vtsParams) \ // { _T(""), dispid, vtsParams, VT_BOOL, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnHandler, (WSB_PMSG)0, 0, \ // afxDispCustom, id, (UINT)-1 }, \ // // #define ON_EVENT_RANGE(theClass, idFirst, idLast, dispid, pfnHandler, vtsParams) \ // { _T(""), dispid, vtsParams, VT_BOOL, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnHandler, (WSB_PMSG)0, 0, \ // afxDispCustom, idFirst, idLast }, \ // // #define ON_PROPNOTIFY(theClass, id, dispid, pfnRequest, pfnChanged) \ // { _T(""), dispid, VTS_NONE, VT_VOID, \ // (WSB_PMSG)(BOOL (CCmdTarget::*)(BOOL*))&pfnRequest, \ // (WSB_PMSG)(BOOL (CCmdTarget::*)(void))&pfnChanged, \ // 1, afxDispCustom, id, (UINT)-1 }, \ // // #define ON_PROPNOTIFY_RANGE(theClass, idFirst, idLast, dispid, pfnRequest, pfnChanged) \ // { _T(""), dispid, VTS_NONE, VT_VOID, \ // (WSB_PMSG)(BOOL (CCmdTarget::*)(UINT, BOOL*))&pfnRequest, \ // (WSB_PMSG)(BOOL (CCmdTarget::*)(UINT))&pfnChanged, \ // 1, afxDispCustom, idFirst, idLast }, \ // // #define ON_DSCNOTIFY(theClass, id, pfnNotify) \ // { _T(""), DISPID_UNKNOWN, VTS_NONE, VT_VOID, \ // (WSB_PMSG)(BOOL (CCmdTarget::*)(DSCSTATE, DSCREASON, BOOL*))&pfnNotify, (WSB_PMSG)0, \ // 1, afxDispCustom, id, (UINT)-1 }, \ // // #define ON_DSCNOTIFY_RANGE(theClass, idFirst, idLast, pfnNotify) \ // { _T(""), DISPID_UNKNOWN, VTS_NONE, VT_VOID, \ // (WSB_PMSG)(BOOL (CCmdTarget::*)(UINT, DSCSTATE, DSCREASON, BOOL*))&pfnNotify, (WSB_PMSG)0, \ // 1, afxDispCustom, idFirst, idLast }, \ // // #define ON_EVENT_REFLECT(theClass, dispid, pfnHandler, vtsParams) \ // { _T(""), dispid, vtsParams, VT_BOOL, \ // (WSB_PMSG)(void (theClass::*)(void))&pfnHandler, (WSB_PMSG)0, 0, \ // afxDispCustom, (UINT)-1, (UINT)-1 }, \ // // #define ON_PROPNOTIFY_REFLECT(theClass, dispid, pfnRequest, pfnChanged) \ // { _T(""), dispid, VTS_NONE, VT_VOID, \ // (WSB_PMSG)(BOOL (CCmdTarget::*)(BOOL*))&pfnRequest, \ // (WSB_PMSG)(BOOL (CCmdTarget::*)(void))&pfnChanged, \ // 1, afxDispCustom, (UINT)-1, (UINT)-1 }, \ // // #endif // !_WSB_NO_OCC_SUPPORT // // ///////////////////////////////////////////////////////////////////////////// // // Macros for type library information // // CTypeLibCache* WSBAPI WsbGetTypeLibCache(const GUID* pTypeLibID); // // #define DECLARE_WSBTYPELIB(class_name) \ // protected: \ // virtual UINT GetTypeInfoCount(); \ // virtual HRESULT GetTypeLib(LCID, LPTYPELIB*); \ // virtual CTypeLibCache* GetTypeLibCache(); \ // // #define IMPLEMENT_WSBTYPELIB(class_name, tlid, wVerMajor, wVerMinor) \ // UINT class_name::GetTypeInfoCount() \ // { return 1; } \ // HRESULT class_name::GetTypeLib(LCID lcid, LPTYPELIB* ppTypeLib) \ // { return ::LoadRegTypeLib(tlid, wVerMajor, wVerMinor, lcid, ppTypeLib); } \ // CTypeLibCache* class_name::GetTypeLibCache() \ // { WSB_MANAGE_STATE(m_pModuleState); return WsbGetTypeLibCache(&tlid); } \ // // ///////////////////////////////////////////////////////////////////////////// // // Init & Term helpers // // BOOL WSBAPI WsbWsbInit(); // void WSBAPI WsbWsbTerm(BOOL bJustRevoke = FALSE); // void WSBAPI WsbWsbTermOrFreeLib(BOOL bTerm = TRUE, BOOL bJustRevoke = FALSE); // // ///////////////////////////////////////////////////////////////////////////// // // Memory management helpers (for WSB task allocator memory) // // #define WsbAllocTaskMem(nSize) CoTaskMemAlloc(nSize) // #define WsbFreeTaskMem(p) CoTaskMemFree(p) // // LPWSTR WSBAPI WsbAllocTaskWideString(LPCWSTR lpszString); // LPWSTR WSBAPI WsbAllocTaskWideString(LPCSTR lpszString); // LPSTR WSBAPI WsbAllocTaskAnsiString(LPCWSTR lpszString); // LPSTR WSBAPI WsbAllocTaskAnsiString(LPCSTR lpszString); // // #ifdef _UNICODE // #define WsbAllocTaskString(x) WsbAllocTaskWideString(x) // #else // #define WsbAllocTaskString(x) WsbAllocTaskAnsiString(x) // #endif // // #ifdef WSB2ANSI // #define WsbAllocTaskWsbString(x) WsbAllocTaskAnsiString(x) // #else // #define WsbAllocTaskWsbString(x) WsbAllocTaskWideString(x) // #endif // // HRESULT WSBAPI WsbGetClassIDFromString(LPCTSTR lpsz, LPCLSID lpClsID); // // ///////////////////////////////////////////////////////////////////////////// // // Special in-proc server APIs // // SCODE WSBAPI WsbDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv); // SCODE WSBAPI WsbDllCanUnloadNow(void); ///////////////////////////////////////////////////////////////////////////// // CWsbDVariant class helpers #define WSB_TRUE (-1) #define WSB_FALSE 0 class CLongBinary; // forward reference (see afxdb_.h) ///////////////////////////////////////////////////////////////////////////// // CWsbDVariant class - wraps VARIANT types typedef const VARIANT* LPCVARIANT; class CWsbDVariant : public tagVARIANT { // Constructors public: CWsbDVariant(); CWsbDVariant(const VARIANT& varSrc); CWsbDVariant(LPCVARIANT pSrc); CWsbDVariant(const CWsbDVariant& varSrc); CWsbDVariant(LPCTSTR lpszSrc); CWsbDVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI string // CWsbDVariant(CString& strSrc); CWsbDVariant(BYTE nSrc); CWsbDVariant(short nSrc, VARTYPE vtSrc = VT_I2); CWsbDVariant(long lSrc, VARTYPE vtSrc = VT_I4); // CWsbDVariant(const CWsbCurrency& curSrc); CWsbDVariant(float fltSrc); CWsbDVariant(double dblSrc); CWsbDVariant(const CWsbDateTime& timeSrc); // CWsbDVariant(const CByteArray& arrSrc); // CWsbDVariant(const CLongBinary& lbSrc); // Operations public: void Clear(); void ChangeType(VARTYPE vartype, LPVARIANT pSrc = NULL); void Attach(VARIANT& varSrc); VARIANT Detach(); BOOL operator==(const VARIANT& varSrc) const; BOOL operator==(LPCVARIANT pSrc) const; const CWsbDVariant& operator=(const VARIANT& varSrc); const CWsbDVariant& operator=(LPCVARIANT pSrc); const CWsbDVariant& operator=(const CWsbDVariant& varSrc); const CWsbDVariant& operator=(const LPCTSTR lpszSrc); // const CWsbDVariant& operator=(const CString& strSrc); const CWsbDVariant& operator=(BYTE nSrc); const CWsbDVariant& operator=(short nSrc); const CWsbDVariant& operator=(long lSrc); // const CWsbDVariant& operator=(const CWsbCurrency& curSrc); const CWsbDVariant& operator=(float fltSrc); const CWsbDVariant& operator=(double dblSrc); const CWsbDVariant& operator=(const CWsbDateTime& dateSrc); // const CWsbDVariant& operator=(const CByteArray& arrSrc); // const CWsbDVariant& operator=(const CLongBinary& lbSrc); void SetString(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set ANSI string operator LPVARIANT(); operator LPCVARIANT() const; // // Implementation public: ~CWsbDVariant(); }; // CWsbDVariant diagnostics and serialization // #ifdef _DEBUG // CDumpContext& WSBAPI operator<<(CDumpContext& dc, CWsbDVariant varSrc); // #endif // CArchive& WSBAPI operator<<(CArchive& ar, CWsbDVariant varSrc); // CArchive& WSBAPI operator>>(CArchive& ar, CWsbDVariant& varSrc); // Helper for initializing VARIANT structures void WSBAPI WsbDVariantInit(LPVARIANT pVar); // ///////////////////////////////////////////////////////////////////////////// // // CWsbCurrency class // // class CWsbCurrency // { // // Constructors // public: // CWsbCurrency(); // // CWsbCurrency(CURRENCY cySrc); // CWsbCurrency(const CWsbCurrency& curSrc); // CWsbCurrency(const VARIANT& varSrc); // CWsbCurrency(long nUnits, long nFractionalUnits); // // // Attributes // public: // enum CurrencyStatus // { // valid = 0, // invalid = 1, // Invalid currency (overflow, div 0, etc.) // null = 2, // Literally has no value // }; // // CURRENCY m_cur; // CurrencyStatus m_status; // // void SetStatus(CurrencyStatus status); // CurrencyStatus etStatus() const; // // // Operations // public: // const CWsbCurrency& operator=(CURRENCY cySrc); // const CWsbCurrency& operator=(const CWsbCurrency& curSrc); // const CWsbCurrency& operator=(const VARIANT& varSrc); // // BOOL operator==(const CWsbCurrency& cur) const; // BOOL operator!=(const CWsbCurrency& cur) const; // BOOL operator<(const CWsbCurrency& cur) const; // BOOL operator>(const CWsbCurrency& cur) const; // BOOL operator<=(const CWsbCurrency& cur) const; // BOOL operator>=(const CWsbCurrency& cur) const; // // // Currency math // CWsbCurrency operator+(const CWsbCurrency& cur) const; // CWsbCurrency operator-(const CWsbCurrency& cur) const; // const CWsbCurrency& operator+=(const CWsbCurrency& cur); // const CWsbCurrency& operator-=(const CWsbCurrency& cur); // CWsbCurrency operator-() const; // // CWsbCurrency operator*(long nOperand) const; // CWsbCurrency operator/(long nOperand) const; // const CWsbCurrency& operator*=(long nOperand); // const CWsbCurrency& operator/=(long nOperand); // // operator CURRENCY() const; // // // Currency definition // void SetCurrency(long nUnits, long nFractionalUnits); // BOOL ParseCurrency(LPCTSTR lpszCurrency, DWORD dwFlags = 0, // LCID = LANG_USER_DEFAULT); // // // formatting // CString Format(DWORD dwFlags = 0, LCID lcid = LANG_USER_DEFAULT) const; // }; // // // CWsbCurrency diagnostics and serialization // #ifdef _DEBUG // CDumpContext& WSBAPI operator<<(CDumpContext& dc, CWsbCurrency curSrc); // #endif // CArchive& WSBAPI operator<<(CArchive& ar, CWsbCurrency curSrc); // CArchive& WSBAPI operator>>(CArchive& ar, CWsbCurrency& curSrc); ///////////////////////////////////////////////////////////////////////////// // CWsbDateTime class helpers #define WSB_DATETIME_ERROR (-1) ///////////////////////////////////////////////////////////////////////////// // CWsbDateTime class class CWsbDateTime { // Constructors public: static CWsbDateTime PASCAL GetCurrentTime(); CWsbDateTime(); CWsbDateTime(const CWsbDateTime& dateSrc); CWsbDateTime(const VARIANT& varSrc); CWsbDateTime(DATE dtSrc); CWsbDateTime(time_t timeSrc); CWsbDateTime(const SYSTEMTIME& systimeSrc); CWsbDateTime(const FILETIME& filetimeSrc); CWsbDateTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec); CWsbDateTime(WORD wDosDate, WORD wDosTime); // Attributes public: enum DateTimeStatus { valid = 0, invalid = 1, // Invalid date (out of range, etc.) null = 2, // Literally has no value }; DATE m_dt; DateTimeStatus m_status; void SetStatus(DateTimeStatus status); DateTimeStatus GetStatus() const; int GetYear() const; int GetMonth() const; // month of year (1 = Jan) int GetDay() const; // day of month (0-31) int GetHour() const; // hour in day (0-23) int GetMinute() const; // minute in hour (0-59) int GetSecond() const; // second in minute (0-59) int GetDayOfWeek() const; // 1=Sun, 2=Mon, ..., 7=Sat int GetDayOfYear() const; // days since start of year, Jan 1 = 1 // Operations public: const CWsbDateTime& operator=(const CWsbDateTime& dateSrc); const CWsbDateTime& operator=(const VARIANT& varSrc); const CWsbDateTime& operator=(DATE dtSrc); const CWsbDateTime& operator=(const time_t& timeSrc); const CWsbDateTime& operator=(const SYSTEMTIME& systimeSrc); const CWsbDateTime& operator=(const FILETIME& filetimeSrc); BOOL operator==(const CWsbDateTime& date) const; BOOL operator!=(const CWsbDateTime& date) const; BOOL operator<(const CWsbDateTime& date) const; BOOL operator>(const CWsbDateTime& date) const; BOOL operator<=(const CWsbDateTime& date) const; BOOL operator>=(const CWsbDateTime& date) const; // DateTime math CWsbDateTime operator+(const CWsbDateTimeSpan& dateSpan) const; CWsbDateTime operator-(const CWsbDateTimeSpan& dateSpan) const; const CWsbDateTime& operator+=(const CWsbDateTimeSpan dateSpan); const CWsbDateTime& operator-=(const CWsbDateTimeSpan dateSpan); // DateTimeSpan math CWsbDateTimeSpan operator-(const CWsbDateTime& date) const; operator DATE() const; BOOL SetDateTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec); BOOL SetDate(int nYear, int nMonth, int nDay); BOOL SetTime(int nHour, int nMin, int nSec); // BOOL ParseDateTime(LPCTSTR lpszDate, DWORD dwFlags = 0, // LCID lcid = LANG_USER_DEFAULT); // formatting // CString Format(DWORD dwFlags = 0, LCID lcid = LANG_USER_DEFAULT) const; // CString Format(LPCTSTR lpszFormat) const; // CString Format(UINT nFormatID) const; // Implementation protected: void CheckRange(); friend CWsbDateTimeSpan; }; // CWsbDateTime diagnostics and serialization // #ifdef _DEBUG // CDumpContext& WSBAPI operator<<(CDumpContext& dc, CWsbDateTime dateSrc); // #endif // CArchive& WSBAPI operator<<(CArchive& ar, CWsbDateTime dateSrc); // CArchive& WSBAPI operator>>(CArchive& ar, CWsbDateTime& dateSrc); ///////////////////////////////////////////////////////////////////////////// // CWsbDateTimeSpan class class CWsbDateTimeSpan { // Constructors public: CWsbDateTimeSpan(); CWsbDateTimeSpan(double dblSpanSrc); CWsbDateTimeSpan(const CWsbDateTimeSpan& dateSpanSrc); CWsbDateTimeSpan(long lDays, int nHours, int nMins, int nSecs); // Attributes public: enum DateTimeSpanStatus { valid = 0, invalid = 1, // Invalid span (out of range, etc.) null = 2, // Literally has no value }; double m_span; DateTimeSpanStatus m_status; void SetStatus(DateTimeSpanStatus status); DateTimeSpanStatus GetStatus() const; double GetTotalDays() const; // span in days (about -3.65e6 to 3.65e6) double GetTotalHours() const; // span in hours (about -8.77e7 to 8.77e6) double GetTotalMinutes() const; // span in minutes (about -5.26e9 to 5.26e9) double GetTotalSeconds() const; // span in seconds (about -3.16e11 to 3.16e11) long GetDays() const; // component days in span long GetHours() const; // component hours in span (-23 to 23) long GetMinutes() const; // component minutes in span (-59 to 59) long GetSeconds() const; // component seconds in span (-59 to 59) // Operations public: const CWsbDateTimeSpan& operator=(double dblSpanSrc); const CWsbDateTimeSpan& operator=(const CWsbDateTimeSpan& dateSpanSrc); BOOL operator==(const CWsbDateTimeSpan& dateSpan) const; BOOL operator!=(const CWsbDateTimeSpan& dateSpan) const; BOOL operator<(const CWsbDateTimeSpan& dateSpan) const; BOOL operator>(const CWsbDateTimeSpan& dateSpan) const; BOOL operator<=(const CWsbDateTimeSpan& dateSpan) const; BOOL operator>=(const CWsbDateTimeSpan& dateSpan) const; // DateTimeSpan math CWsbDateTimeSpan operator+(const CWsbDateTimeSpan& dateSpan) const; CWsbDateTimeSpan operator-(const CWsbDateTimeSpan& dateSpan) const; const CWsbDateTimeSpan& operator+=(const CWsbDateTimeSpan dateSpan); const CWsbDateTimeSpan& operator-=(const CWsbDateTimeSpan dateSpan); CWsbDateTimeSpan operator-() const; operator double() const; void SetDateTimeSpan(long lDays, int nHours, int nMins, int nSecs); // formatting // CString Format(LPCTSTR pFormat) const; // CString Format(UINT nID) const; // Implementation public: void CheckRange(); friend CWsbDateTime; }; // CWsbDateTimeSpan diagnostics and serialization // #ifdef _DEBUG // CDumpContext& WSBAPI operator<<(CDumpContext& dc,CWsbDateTimeSpan dateSpanSrc); // #endif // CArchive& WSBAPI operator<<(CArchive& ar, CWsbDateTimeSpan dateSpanSrc); // CArchive& WSBAPI operator>>(CArchive& ar, CWsbDateTimeSpan& dateSpanSrc); ///////////////////////////////////////////////////////////////////////////// // Helper for initializing CWsbSafeArray // void WSBAPI WsbSafeArrayInit(CWsbSafeArray* psa); // ///////////////////////////////////////////////////////////////////////////// // // CSafeArray class // // typedef const SAFEARRAY* LPCSAFEARRAY; // // class CWsbSafeArray : public tagVARIANT // { // //Constructors // public: // CWsbSafeArray(); // CWsbSafeArray(const SAFEARRAY& saSrc, VARTYPE vtSrc); // CWsbSafeArray(LPCSAFEARRAY pSrc, VARTYPE vtSrc); // CWsbSafeArray(const CWsbSafeArray& saSrc); // CWsbSafeArray(const VARIANT& varSrc); // CWsbSafeArray(LPCVARIANT pSrc); // CWsbSafeArray(const CWsbDVariant& varSrc); // // // Operations // public: // void Clear(); // void Attach(VARIANT& varSrc); // VARIANT Detach(); // // CWsbSafeArray& operator=(const CWsbSafeArray& saSrc); // CWsbSafeArray& operator=(const VARIANT& varSrc); // CWsbSafeArray& operator=(LPCVARIANT pSrc); // CWsbSafeArray& operator=(const CWsbDVariant& varSrc); // // BOOL operator==(const SAFEARRAY& saSrc) const; // BOOL operator==(LPCSAFEARRAY pSrc) const; // BOOL operator==(const CWsbSafeArray& saSrc) const; // BOOL operator==(const VARIANT& varSrc) const; // BOOL operator==(LPCVARIANT pSrc) const; // BOOL operator==(const CWsbDVariant& varSrc) const; // // operator LPVARIANT(); // operator LPCVARIANT() const; // // // One dim array helpers // void CreateOneDim(VARTYPE vtSrc, DWORD dwElements, // void* pvSrcData = NULL, long nLBound = 0); // DWORD GetOneDimSize(); // void ResizeOneDim(DWORD dwElements); // // // Multi dim array helpers // void Create(VARTYPE vtSrc, DWORD dwDims, DWORD* rgElements); // // // SafeArray wrapper classes // void Create(VARTYPE vtSrc, DWORD dwDims, SAFEARRAYBOUND* rgsabounds); // void AccessData(void** ppvData); // void UnaccessData(); // void AllocData(); // void AllocDescriptor(DWORD dwDims); // void Copy(LPSAFEARRAY* ppsa); // void GetLBound(DWORD dwDim, long* pLBound); // void GetUBound(DWORD dwDim, long* pUBound); // void GetElement(long* rgIndices, void* pvData); // void PtrOfIndex(long* rgIndices, void** ppvData); // void PutElement(long* rgIndices, void* pvData); // void Redim(SAFEARRAYBOUND* psaboundNew); // void Lock(); // void Unlock(); // DWORD GetDim(); // DWORD GetElemSize(); // void Destroy(); // void DestroyData(); // void DestroyDescriptor(); // // //Implementation // public: // ~CWsbSafeArray(); // // // Cache info to make element access (operator []) faster // DWORD m_dwElementSize; // DWORD m_dwDims; // }; // // // CWsbSafeArray diagnostics and serialization // #ifdef _DEBUG // CDumpContext& WSBAPI operator<<(CDumpContext& dc, CWsbSafeArray saSrc); // #endif // CArchive& WSBAPI operator<<(CArchive& ar, CWsbSafeArray saSrc); // CArchive& WSBAPI operator>>(CArchive& ar, CWsbSafeArray& saSrc); // ///////////////////////////////////////////////////////////////////////////// // // DDX_ functions for WSB controls on dialogs // // #ifndef _WSB_NO_OCC_SUPPORT // // void WSBAPI DDX_OCText(CDataExchange* pDX, int nIDC, DISPID dispid, // CString& value); // void WSBAPI DDX_OCTextRO(CDataExchange* pDX, int nIDC, DISPID dispid, // CString& value); // void WSBAPI DDX_OCBool(CDataExchange* pDX, int nIDC, DISPID dispid, // BOOL& value); // void WSBAPI DDX_OCBoolRO(CDataExchange* pDX, int nIDC, DISPID dispid, // BOOL& value); // void WSBAPI DDX_OCInt(CDataExchange* pDX, int nIDC, DISPID dispid, // int &value); // void WSBAPI DDX_OCIntRO(CDataExchange* pDX, int nIDC, DISPID dispid, // int &value); // void WSBAPI DDX_OCInt(CDataExchange* pDX, int nIDC, DISPID dispid, // long &value); // void WSBAPI DDX_OCIntRO(CDataExchange* pDX, int nIDC, DISPID dispid, // long &value); // void WSBAPI DDX_OCShort(CDataExchange* pDX, int nIDC, DISPID dispid, // short& value); // void WSBAPI DDX_OCShortRO(CDataExchange* pDX, int nIDC, DISPID dispid, // short& value); // void WSBAPI DDX_OCColor(CDataExchange* pDX, int nIDC, DISPID dispid, // WSB_COLOR& value); // void WSBAPI DDX_OCColorRO(CDataExchange* pDX, int nIDC, DISPID dispid, // WSB_COLOR& value); // void WSBAPI DDX_OCFloat(CDataExchange* pDX, int nIDC, DISPID dispid, // float& value); // void WSBAPI DDX_OCFloatRO(CDataExchange* pDX, int nIDC, DISPID dispid, // float& value); // void WSBAPI DDX_OCFloat(CDataExchange* pDX, int nIDC, DISPID dispid, // double& value); // void WSBAPI DDX_OCFloatRO(CDataExchange* pDX, int nIDC, DISPID dispid, // double& value); // // #endif // !_WSB_NO_OCC_SUPPORT // // ///////////////////////////////////////////////////////////////////////////// // // Function to enable containment of WSB controls // // #ifndef _WSB_NO_OCC_SUPPORT // void WSB_CDECL WsbEnableControlContainer(COccManager* pOccManager=NULL); // #else // #define WsbEnableControlContainer() // #endif // // ///////////////////////////////////////////////////////////////////////////// // // Inline function declarations // // #ifdef _WSB_PACKING // #pragma pack(pop) // #endif // // #ifdef _WSB_ENABLE_INLINES // #define _WSBDATE_INLINE inline // #include // #undef _WSBDATE_INLINE // #endif // // #undef WSB_DATA // #define WSB_DATA // // #ifdef _WSB_MINREBUILD // #pragma component(minrebuild, on) // #endif // #ifndef _WSB_FULLTYPEINFO // #pragma component(mintypeinfo, off) // #endif // // // Low level sanity checks for memory blocks // // this was copied from afx.h BOOL WSBAPI WsbIsValidAddress(const void* lp, UINT nBytes, BOOL bReadWrite = TRUE); // // Inline Functions // // These were copied from afxole.inl // #define _WSBDISP_INLINE inline // CWsbDVariant _WSBDISP_INLINE CWsbDVariant::CWsbDVariant() { WsbDVariantInit(this); } _WSBDISP_INLINE CWsbDVariant::~CWsbDVariant() { ::VariantClear(this); } _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(LPCTSTR lpszSrc) { vt = VT_EMPTY; *this = lpszSrc; } // _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(CString& strSrc) // { vt = VT_EMPTY; *this = strSrc; } // _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(BYTE nSrc) // { vt = VT_UI1; bVal = nSrc; } // _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(const CWsbCurrency& curSrc) // { vt = VT_CY; cyVal = curSrc.m_cur; } _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(float fltSrc) { vt = VT_R4; fltVal = fltSrc; } _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(double dblSrc) { vt = VT_R8; dblVal = dblSrc; } _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(const CWsbDateTime& dateSrc) { vt = VT_DATE; date = dateSrc.m_dt; } // _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(const CByteArray& arrSrc) // { vt = VT_EMPTY; *this = arrSrc; } // _WSBDISP_INLINE CWsbDVariant::CWsbDVariant(const CLongBinary& lbSrc) // { vt = VT_EMPTY; *this = lbSrc; } _WSBDISP_INLINE BOOL CWsbDVariant::operator==(LPCVARIANT pSrc) const { return *this == *pSrc; } _WSBDISP_INLINE CWsbDVariant::operator LPVARIANT() { return this; } _WSBDISP_INLINE CWsbDVariant::operator LPCVARIANT() const { return this; } // CWsbDateTime _WSBDISP_INLINE CWsbDateTime::CWsbDateTime() { m_dt = 0; SetStatus(valid); } _WSBDISP_INLINE CWsbDateTime::CWsbDateTime(const CWsbDateTime& dateSrc) { m_dt = dateSrc.m_dt; m_status = dateSrc.m_status; } _WSBDISP_INLINE CWsbDateTime::CWsbDateTime(const VARIANT& varSrc) { *this = varSrc; } _WSBDISP_INLINE CWsbDateTime::CWsbDateTime(DATE dtSrc) { m_dt = dtSrc; SetStatus(valid); } _WSBDISP_INLINE CWsbDateTime::CWsbDateTime(time_t timeSrc) { *this = timeSrc; } _WSBDISP_INLINE CWsbDateTime::CWsbDateTime(const SYSTEMTIME& systimeSrc) { *this = systimeSrc; } _WSBDISP_INLINE CWsbDateTime::CWsbDateTime(const FILETIME& filetimeSrc) { *this = filetimeSrc; } _WSBDISP_INLINE CWsbDateTime::CWsbDateTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec) { SetDateTime(nYear, nMonth, nDay, nHour, nMin, nSec); } _WSBDISP_INLINE CWsbDateTime::CWsbDateTime(WORD wDosDate, WORD wDosTime) { m_status = DosDateTimeToVariantTime(wDosDate, wDosTime, &m_dt) ? valid : invalid; } _WSBDISP_INLINE const CWsbDateTime& CWsbDateTime::operator=(const CWsbDateTime& dateSrc) { m_dt = dateSrc.m_dt; m_status = dateSrc.m_status; return *this; } _WSBDISP_INLINE CWsbDateTime::DateTimeStatus CWsbDateTime::GetStatus() const { return m_status; } _WSBDISP_INLINE void CWsbDateTime::SetStatus(DateTimeStatus status) { m_status = status; } _WSBDISP_INLINE BOOL CWsbDateTime::operator==(const CWsbDateTime& date) const { return (m_status == date.m_status && m_dt == date.m_dt); } _WSBDISP_INLINE BOOL CWsbDateTime::operator!=(const CWsbDateTime& date) const { return (m_status != date.m_status || m_dt != date.m_dt); } _WSBDISP_INLINE const CWsbDateTime& CWsbDateTime::operator+=( const CWsbDateTimeSpan dateSpan) { *this = *this + dateSpan; return *this; } _WSBDISP_INLINE const CWsbDateTime& CWsbDateTime::operator-=( const CWsbDateTimeSpan dateSpan) { *this = *this - dateSpan; return *this; } _WSBDISP_INLINE CWsbDateTime::operator DATE() const { return m_dt; } _WSBDISP_INLINE CWsbDateTime::SetDate(int nYear, int nMonth, int nDay) { return SetDateTime(nYear, nMonth, nDay, 0, 0, 0); } _WSBDISP_INLINE CWsbDateTime::SetTime(int nHour, int nMin, int nSec) // Set date to zero date - 12/30/1899 { return SetDateTime(1899, 12, 30, nHour, nMin, nSec); } // CWsbDateTimeSpan _WSBDISP_INLINE CWsbDateTimeSpan::CWsbDateTimeSpan() { m_span = 0; SetStatus(valid); } _WSBDISP_INLINE CWsbDateTimeSpan::CWsbDateTimeSpan(double dblSpanSrc) { m_span = dblSpanSrc; SetStatus(valid); } _WSBDISP_INLINE CWsbDateTimeSpan::CWsbDateTimeSpan( const CWsbDateTimeSpan& dateSpanSrc) { m_span = dateSpanSrc.m_span; m_status = dateSpanSrc.m_status; } _WSBDISP_INLINE CWsbDateTimeSpan::CWsbDateTimeSpan( long lDays, int nHours, int nMins, int nSecs) { SetDateTimeSpan(lDays, nHours, nMins, nSecs); } _WSBDISP_INLINE CWsbDateTimeSpan::DateTimeSpanStatus CWsbDateTimeSpan::GetStatus() const { return m_status; } _WSBDISP_INLINE void CWsbDateTimeSpan::SetStatus(DateTimeSpanStatus status) { m_status = status; } _WSBDISP_INLINE double CWsbDateTimeSpan::GetTotalDays() const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); return m_span; } _WSBDISP_INLINE double CWsbDateTimeSpan::GetTotalHours() const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); return m_span * 24; } _WSBDISP_INLINE double CWsbDateTimeSpan::GetTotalMinutes() const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); return m_span * 24 * 60; } _WSBDISP_INLINE double CWsbDateTimeSpan::GetTotalSeconds() const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); return m_span * 24 * 60 * 60; } _WSBDISP_INLINE long CWsbDateTimeSpan::GetDays() const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); return (long)m_span; } _WSBDISP_INLINE BOOL CWsbDateTimeSpan::operator==( const CWsbDateTimeSpan& dateSpan) const { return (m_status == dateSpan.m_status && m_span == dateSpan.m_span); } _WSBDISP_INLINE BOOL CWsbDateTimeSpan::operator!=( const CWsbDateTimeSpan& dateSpan) const { return (m_status != dateSpan.m_status || m_span != dateSpan.m_span); } _WSBDISP_INLINE BOOL CWsbDateTimeSpan::operator<( const CWsbDateTimeSpan& dateSpan) const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); WsbAssert(dateSpan.GetStatus() == valid, WSB_E_INVALID_DATA); return m_span < dateSpan.m_span; } _WSBDISP_INLINE BOOL CWsbDateTimeSpan::operator>( const CWsbDateTimeSpan& dateSpan) const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); WsbAssert(dateSpan.GetStatus() == valid, WSB_E_INVALID_DATA); return m_span > dateSpan.m_span; } _WSBDISP_INLINE BOOL CWsbDateTimeSpan::operator<=( const CWsbDateTimeSpan& dateSpan) const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); WsbAssert(dateSpan.GetStatus() == valid, WSB_E_INVALID_DATA); return m_span <= dateSpan.m_span; } _WSBDISP_INLINE BOOL CWsbDateTimeSpan::operator>=( const CWsbDateTimeSpan& dateSpan) const { WsbAssert(GetStatus() == valid, WSB_E_INVALID_DATA); WsbAssert(dateSpan.GetStatus() == valid, WSB_E_INVALID_DATA); return m_span >= dateSpan.m_span; } _WSBDISP_INLINE const CWsbDateTimeSpan& CWsbDateTimeSpan::operator+=( const CWsbDateTimeSpan dateSpan) { *this = *this + dateSpan; return *this; } _WSBDISP_INLINE const CWsbDateTimeSpan& CWsbDateTimeSpan::operator-=( const CWsbDateTimeSpan dateSpan) { *this = *this - dateSpan; return *this; } _WSBDISP_INLINE CWsbDateTimeSpan CWsbDateTimeSpan::operator-() const { return -this->m_span; } _WSBDISP_INLINE CWsbDateTimeSpan::operator double() const { return m_span; } #undef _WSBDISP_INLINE #endif //__WSBDATE_H__ /////////////////////////////////////////////////////////////////////////////