Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1577 lines
63 KiB

#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 <afxwin.h>
// #endif
//
// // include necessary WSB headers
// #ifndef _OBJBASE_H_
// #include <objbase.h>
// #endif
// #ifndef _WSBAUTO_H_
// #include <oleauto.h>
// #endif
// #ifndef _WSBCTL_H_
// #include <olectl.h>
// #endif
// //REVIEW: This header has no symbol to prevent repeated includes
// #include <olectlid.h>
// #ifndef __ocidl_h__
// #include <ocidl.h>
// #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 <afxole.inl>
// #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__
/////////////////////////////////////////////////////////////////////////////