Index: /Include/OAIdl.ab
===================================================================
--- /Include/OAIdl.ab	(revision 210)
+++ /Include/OAIdl.ab	(revision 211)
@@ -86,9 +86,4 @@
 
 TypeDef DATE = Double ' WTypes.ab
-
-Interface IRecordInfo
-	Inherits IUnknown
-End Interface
-
 
 /* interface IOleAutomationTypes */
@@ -1567,6 +1562,4 @@
 
 
-#ifdef __UNDECLARED__
-
 #ifndef __ITypeLib2_INTERFACE_DEFINED__
 #define __ITypeLib2_INTERFACE_DEFINED__
@@ -1575,32 +1568,26 @@
 /* [unique][uuid][object] */
 
-TypeDef /* [unique] */ ITypeLib2 *LPTYPELIB2;
-
-
-EXTERN_C const IID IID_ITypeLib2;
-
-    MIDL_INTERFACE("00020411-0000-0000-C000-000000000046")
-    ITypeLib2 : public ITypeLib
-    {
-    public:
-        Function GetCustData(
-            /* [in] */ REFGUID guid,
-            /* [out] */ VARIANT *pVarVal) As HRESULT
-
-        virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetLibStatistics(
-            /* [out] */ ULONG *pcUniqueNames,
-            /* [out] */ ULONG *pcchUniqueNames) As HRESULT
-
-        virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDocumentation2(
-            /* [in] */ INT index,
-            /* [in] */ LCID lcid,
-            /* [out] */ BSTR *pbstrHelpString,
-            /* [out] */ DWORD *pdwHelpStringContext,
-            /* [out] */ BSTR *pbstrHelpStringDll) As HRESULT
-
-        Function GetAllCustData(
-            /* [out] */ CUSTDATA *pCustData) As HRESULT
-
-    };
+TypeDef LPTYPELIB2 = /* [unique] */ *ITypeLib2
+
+Dim IID_ITypeLib2 = [&h00020411, &h0000, &h0000, [&hC0, &h00, &h00, &h00, &h00, &h00, &h00, &h46]] As IID
+
+Interface ITypeLib2
+	Inherits ITypeLib
+
+	Function GetCustData(
+		/* [in] */ ByRef guid As GUID,
+		/* [out] */ ByRef VarVal As VARIANT) As HRESULT
+	/* [local] */ Function GetLibStatistics(
+		/* [out] */ ByRef cUniqueNames As DWord,
+		/* [out] */ ByRef chUniqueNames As DWord) As HRESULT
+	/* [local] */ Function GetDocumentation2(
+            /* [in] */ index As Long,
+            /* [in] */ lcid As LCID,
+            /* [out] */ ByRef bstrHelpString As BSTR,
+            /* [out] */ ByRef dwHelpStringContext As DWord,
+            /* [out] */ ByRef bstrHelpStringDll As BSTR) As HRESULT
+	Function GetAllCustData(
+		/* [out] */ ByRef CustData As CUSTDATA) As HRESULT
+End Interface
 
 #endif 	/* __ITypeLib2_INTERFACE_DEFINED__ */
@@ -1613,36 +1600,32 @@
 /* [local][unique][uuid][object] */
 
-TypeDef /* [unique] */ ITypeChangeEvents *LPTYPECHANGEEVENTS;
+TypeDef LPTYPECHANGEEVENTS = /* [unique] */ *ITypeChangeEvents
 
 Enum CHANGEKIND
-	CHANGEKIND_ADDMEMBER = 0,
-	CHANGEKIND_DELETEMEMBER = CHANGEKIND_ADDMEMBER + 1,
-	CHANGEKIND_SETNAMES = CHANGEKIND_DELETEMEMBER + 1,
-	CHANGEKIND_SETDOCUMENTATION = CHANGEKIND_SETNAMES + 1,
-	CHANGEKIND_GENERAL = CHANGEKIND_SETDOCUMENTATION + 1,
-	CHANGEKIND_INVALIDATE = CHANGEKIND_GENERAL + 1,
-	CHANGEKIND_CHANGEFAILED = CHANGEKIND_INVALIDATE + 1,
-	CHANGEKIND_MAX = CHANGEKIND_CHANGEFAILED + 1
+	CHANGEKIND_ADDMEMBER = 0
+	CHANGEKIND_DELETEMEMBER = 1
+	CHANGEKIND_SETNAMES = 2
+	CHANGEKIND_SETDOCUMENTATION = 3
+	CHANGEKIND_GENERAL = 4
+	CHANGEKIND_INVALIDATE = 5
+	CHANGEKIND_CHANGEFAILED = 6
+	CHANGEKIND_MAX = 7
 End Enum
 
-
-EXTERN_C const IID IID_ITypeChangeEvents;
-
-    MIDL_INTERFACE("00020410-0000-0000-C000-000000000046")
-    ITypeChangeEvents : public IUnknown
-    {
-    public:
-        Function RequestTypeChange(
-            /* [in] */ CHANGEKIND changeKind,
-            /* [in] */ ITypeInfo *pTInfoBefore,
-            /* [in] */ LPOLESTR pStrName,
-            /* [out] */ INT *pfCancel) As HRESULT
-
-        Function AfterTypeChange(
-            /* [in] */ CHANGEKIND changeKind,
-            /* [in] */ ITypeInfo *pTInfoAfter,
-            /* [in] */ LPOLESTR pStrName) As HRESULT
-
-    };
+Dim IID_ITypeChangeEvents = [&h00020410, &h0000, &h0000, [&hC0, &h00, &h00, &h00, &h00, &h00, &h00, &h46]] As IID
+
+Interface ITypeChangeEvents
+	Inherits IUnknown
+
+	Function RequestTypeChange(
+		/* [in] */ changeKind As CHANGEKIND,
+		/* [in] */ pTInfoBefore As ITypeInfo,
+		/* [in] */ pStrName As LPOLESTR,
+		/* [out] */ ByRef fCancel As Long) As HRESULT
+	Function AfterTypeChange(
+		/* [in] */ changeKind As CHANGEKIND,
+		/* [in] */ pTInfoAfter As *ITypeInfo,
+		/* [in] */ pStrName As LPOLESTR) As HRESULT
+End Interface
 
 #endif 	/* __ITypeChangeEvents_INTERFACE_DEFINED__ */
@@ -1655,29 +1638,22 @@
 /* [unique][uuid][object] */
 
-TypeDef /* [unique] */ IErrorInfo *LPERRORINFO;
-
-
-EXTERN_C const IID IID_IErrorInfo;
-
-    MIDL_INTERFACE("1CF2B120-547D-101B-8E65-08002B2BD119")
-    IErrorInfo : public IUnknown
-    {
-    public:
-        Function GetGUID(
-            /* [out] */ GUID *pGUID) As HRESULT
-
-        Function GetSource(
-            /* [out] */ BSTR *pBstrSource) As HRESULT
-
-        Function GetDescription(
-            /* [out] */ BSTR *pBstrDescription) As HRESULT
-
-        Function GetHelpFile(
-            /* [out] */ BSTR *pBstrHelpFile) As HRESULT
-
-        Function GetHelpContext(
-            /* [out] */ DWORD *pdwHelpContext) As HRESULT
-
-    };
+TypeDef LPERRORINFO = /* [unique] */ *IErrorInfo
+
+Dim IID_IErrorInfo = [&h1CF2B120, &h547D, &h101B, [&h8E, &h65, &h08, &h00, &h2B, &h2B, &hD1, &h19]] As IID
+
+Interface IErrorInfo
+	Inherits IUnknown
+
+	Function GetGUID(
+		/* [out] */ ByRef guid As GUID) As HRESULT
+	Function GetSource(
+		/* [out] */ ByRef BstrSource As BSTR) As HRESULT
+	Function GetDescription(
+		/* [out] */ ByRef BstrDescription As BSTR) As HRESULT
+	Function GetHelpFile(
+		/* [out] */ ByRef BstrHelpFile As BSTR) As HRESULT
+	Function GetHelpContext(
+		/* [out] */ ByRef dwHelpContext As DWord) As HRESULT
+End Interface
 
 #endif 	/* __IErrorInfo_INTERFACE_DEFINED__ */
@@ -1690,29 +1666,22 @@
 /* [unique][uuid][object] */
 
-TypeDef /* [unique] */ ICreateErrorInfo *LPCREATEERRORINFO;
-
-
-EXTERN_C const IID IID_ICreateErrorInfo;
-
-    MIDL_INTERFACE("22F03340-547D-101B-8E65-08002B2BD119")
-    ICreateErrorInfo : public IUnknown
-    {
-    public:
-        Function SetGUID(
-            /* [in] */ REFGUID rguid) As HRESULT
-
-        Function SetSource(
-            /* [in] */ LPOLESTR szSource) As HRESULT
-
-        Function SetDescription(
-            /* [in] */ LPOLESTR szDescription) As HRESULT
-
-        Function SetHelpFile(
-            /* [in] */ LPOLESTR szHelpFile) As HRESULT
-
-        Function SetHelpContext(
-            /* [in] */ DWORD dwHelpContext) As HRESULT
-
-    };
+TypeDef LPCREATEERRORINFO = /* [unique] */ *ICreateErrorInfo
+
+Dim IID_ICreateErrorInfo = [&h22F03340, &h547D, &h101B, [&h8E, &h65, &h08, &h00, &h2B, &h2B, &hD1, &h19]] As IID
+
+Interface ICreateErrorInfo
+	Inherits IUnknown
+
+	Function SetGUID(
+		/* [in] */ ByRef rguid As GUID) As HRESULT
+	Function SetSource(
+		/* [in] */ szSource As LPOLESTR) As HRESULT
+	Function SetDescription(
+		/* [in] */ szDescription As LPOLESTR) As HRESULT
+	Function SetHelpFile(
+		/* [in] */ szHelpFile As LPOLESTR) As HRESULT
+	Function SetHelpContext(
+		/* [in] */ dwHelpContext As DWord) As HRESULT
+End Interface
 
 #endif 	/* __ICreateErrorInfo_INTERFACE_DEFINED__ */
@@ -1725,17 +1694,14 @@
 /* [unique][uuid][object] */
 
-TypeDef /* [unique] */ ISupportErrorInfo *LPSUPPORTERRORINFO;
-
-
-EXTERN_C const IID IID_ISupportErrorInfo;
-
-    MIDL_INTERFACE("DF0B3D60-548F-101B-8E65-08002B2BD119")
-    ISupportErrorInfo : public IUnknown
-    {
-    public:
-        Function InterfaceSupportsErrorInfo(
-            /* [in] */ REFIID riid) As HRESULT
-
-    };
+TypeDef LPSUPPORTERRORINFO = /* [unique] */ *ISupportErrorInfo
+
+Dim IID_ISupportErrorInfo = [&hDF0B3D60, &h548F, &h101B, [&h8E, &h65, &h08, &h00, &h2B, &h2B, &hD1, &h19]] As IID
+
+Interface ISupportErrorInfo
+	Inherits IUnknown
+
+	Function InterfaceSupportsErrorInfo(
+		/* [in] */ ByRef riid As IID) As HRESULT
+End Interface
 
 #endif 	/* __ISupportErrorInfo_INTERFACE_DEFINED__ */
@@ -1748,17 +1714,14 @@
 /* [uuid][object] */
 
-
-EXTERN_C const IID IID_ITypeFactory;
-
-    MIDL_INTERFACE("0000002E-0000-0000-C000-000000000046")
-    ITypeFactory : public IUnknown
-    {
-    public:
-        Function CreateFromTypeInfo(
-            /* [in] */ ITypeInfo *pTypeInfo,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown **ppv) As HRESULT
-
-    };
+Dim IID_ITypeFactory = [&h0000002E, &h0000, &h0000, [&hC0, &h00, &h00, &h00, &h00, &h00, &h00, &h46]] As IID
+
+Interface ITypeFactory
+	Inherits IUnknown
+
+	Function CreateFromTypeInfo(
+		/* [in] */ pTypeInfo As *ITypeInfo,
+		/* [in] */ ByRef riid As IID,
+		/* [iid_is][out] */ ByRef pv As *IUnknown) As HRESULT
+End Interface
 
 #endif 	/* __ITypeFactory_INTERFACE_DEFINED__ */
@@ -1771,36 +1734,30 @@
 /* [uuid][object][local] */
 
-
-EXTERN_C const IID IID_ITypeMarshal;
-
-    MIDL_INTERFACE("0000002D-0000-0000-C000-000000000046")
-    ITypeMarshal : public IUnknown
-    {
-    public:
-        Function Size(
-            /* [in] */ PVOID pvType,
-            /* [in] */ DWORD dwDestContext,
-            /* [in] */ PVOID pvDestContext,
-            /* [out] */ ULONG *pSize) As HRESULT
-
-        Function Marshal(
-            /* [in] */ PVOID pvType,
-            /* [in] */ DWORD dwDestContext,
-            /* [in] */ PVOID pvDestContext,
-            /* [in] */ ULONG cbBufferLength,
-            /* [out] */ BYTE *pBuffer,
-            /* [out] */ ULONG *pcbWritten) As HRESULT
-
-        Function Unmarshal(
-            /* [out] */ PVOID pvType,
-            /* [in] */ DWORD dwFlags,
-            /* [in] */ ULONG cbBufferLength,
-            /* [in] */ BYTE *pBuffer,
-            /* [out] */ ULONG *pcbRead) As HRESULT
-
-        Function Free(
-            /* [in] */ PVOID pvType) As HRESULT
-
-    };
+Dim IID_ITypeMarshal = [&h0000002D, &h0000, &h0000, [&hC0, &h00, &h00, &h00, &h00, &h00, &h00, &h46]] As IID
+
+Interface ITypeMarshal
+	Inherits IUnknown
+
+	Function Size(
+		/* [in] */ pvType As VoidPtr,
+		/* [in] */ dwDestContext As DWord,
+		/* [in] */ pvDestContext As VoidPtr,
+		/* [out] */ ByRef Size As DWord) As HRESULT
+	Function Marshal(
+		/* [in] */ pvType As VoidPtr,
+		/* [in] */ dwDestContext As DWord,
+		/* [in] */ pvDestContext As VoidPtr,
+		/* [in] */ cbBufferLength As DWord,
+		/* [out] */ pBuffer As *Byte,
+		/* [out] */ ByRef cbWritten As DWord) As HRESULT
+	Function Unmarshal(
+		/* [out] */ pvType As VoidPtr,
+		/* [in] */ dwFlags As DWord,
+		/* [in] */ cbBufferLength As DWord,
+		/* [in] */ pBuffer As *Byte,
+		/* [out] */ ByRef cbRead As DWord) As HRESULT
+	Function Free(
+		/* [in] */ pvType As VoidPtr) As HRESULT
+End Interface
 
 #endif 	/* __ITypeMarshal_INTERFACE_DEFINED__ */
@@ -1813,79 +1770,59 @@
 /* [uuid][object][local] */
 
-TypeDef /* [unique] */ IRecordInfo *LPRECORDINFO;
-
-
-EXTERN_C const IID IID_IRecordInfo;
-
-    MIDL_INTERFACE("0000002F-0000-0000-C000-000000000046")
-    IRecordInfo : public IUnknown
-    {
-    public:
-        Function RecordInit(
-            /* [out] */ PVOID pvNew) As HRESULT
-
-        Function RecordClear(
-            /* [in] */ PVOID pvExisting) As HRESULT
-
-        Function RecordCopy(
-            /* [in] */ PVOID pvExisting,
-            /* [out] */ PVOID pvNew) As HRESULT
-
-        Function GetGuid(
-            /* [out] */ GUID *pguid) As HRESULT
-
-        Function GetName(
-            /* [out] */ BSTR *pbstrName) As HRESULT
-
-        Function GetSize(
-            /* [out] */ ULONG *pcbSize) As HRESULT
-
-        Function GetTypeInfo(
-            /* [out] */ ITypeInfo **ppTypeInfo) As HRESULT
-
-        Function GetField(
-            /* [in] */ PVOID pvData,
-            /* [in] */ LPCOLESTR szFieldName,
-            /* [out] */ VARIANT *pvarField) As HRESULT
-
-        Function GetFieldNoCopy(
-            /* [in] */ PVOID pvData,
-            /* [in] */ LPCOLESTR szFieldName,
-            /* [out] */ VARIANT *pvarField,
-            /* [out] */ PVOID *ppvDataCArray) As HRESULT
-
-        Function PutField(
-            /* [in] */ ULONG wFlags,
-            /* [out][in] */ PVOID pvData,
-            /* [in] */ LPCOLESTR szFieldName,
-            /* [in] */ VARIANT *pvarField) As HRESULT
-
-        Function PutFieldNoCopy(
-            /* [in] */ ULONG wFlags,
-            /* [out][in] */ PVOID pvData,
-            /* [in] */ LPCOLESTR szFieldName,
-            /* [in] */ VARIANT *pvarField) As HRESULT
-
-        Function GetFieldNames(
-            /* [out][in] */ ULONG *pcNames,
-            /* [length_is][size_is][out] */ BSTR *rgBstrNames) As HRESULT
-
-        virtual BOOL STDMETHODCALLTYPE IsMatchingType(
-            /* [in] */ IRecordInfo *pRecordInfo) As HRESULT
-
-        virtual PVOID STDMETHODCALLTYPE RecordCreate( void) As HRESULT
-
-        Function RecordCreateCopy(
-            /* [in] */ PVOID pvSource,
-            /* [out] */ PVOID *ppvDest) As HRESULT
-
-        Function RecordDestroy(
-            /* [in] */ PVOID pvRecord) As HRESULT
-
-    };
+TypeDef LPRECORDINFO = /* [unique] */ *IRecordInfo
+
+Dim IID_IRecordInfo = [&h0000002F, &h0000, &h0000, [&hC0, &h00, &h00, &h00, &h00, &h00, &h00, &h46]] As IID
+
+Interface IRecordInfo
+	Inherits IUnknown
+
+	Function RecordInit(
+		/* [out] */ pvNew As VoidPtr) As HRESULT
+	Function RecordClear(
+		/* [in] */ pvExisting As VoidPtr) As HRESULT
+	Function RecordCopy(
+		/* [in] */ pvExisting As VoidPtr,
+		/* [out] */ pvNew As VoidPtr) As HRESULT
+	Function GetGuid(
+		/* [out] */ ByRef guid As GUID) As HRESULT
+	Function GetName(
+		/* [out] */ ByRef bstrName As BSTR) As HRESULT
+	Function GetSize(
+		/* [out] */ ByRef cbSize As DWord) As HRESULT
+	Function GetTypeInfo(
+		/* [out] */ ByRef pTypeInfo As *ITypeInfo) As HRESULT
+	Function GetField(
+		/* [in] */ pvData As VoidPtr,
+		/* [in] */ szFieldName As LPCOLESTR,
+		/* [out] */ ByRef varField As VARIANT) As HRESULT
+	Function GetFieldNoCopy(
+		/* [in] */ pvData As VoidPtr,
+		/* [in] */ szFieldName As LPCOLESTR,
+		/* [out] */ ByRef varField As VARIANT,
+		/* [out] */ ByRef pvDataCArray As VoidPtr) As HRESULT
+	Function PutField(
+  		/* [in] */ wFlags As DWord,
+		/* [out][in] */ pvData As VoidPtr,
+		/* [in] */ szFieldName As LPCOLESTR,
+		/* [in] */ ByRef varField As VARIANT) As HRESULT
+	Function PutFieldNoCopy(
+  		/* [in] */ wFlags As DWord,
+		/* [out][in] */ pvData As VoidPtr,
+		/* [in] */ szFieldName As LPCOLESTR,
+		/* [in] */ ByRef varField As VARIANT) As HRESULT
+	Function GetFieldNames(
+		/* [out][in] */ ByRef cNames As DWord,
+		/* [length_is][size_is][out] */ rgBstrNames As *BSTR) As HRESULT
+	Function IsMatchingType(
+		/* [in] */ pRecordInfo As *IRecordInfo) As BOOL
+	Function RecordCreate() As VoidPtr
+	Function RecordCreateCopy(
+		/* [in] */ pvSource As VoidPtr,
+		/* [out] */ ByRef pvDest As VoidPtr) As HRESULT
+	Function RecordDestroy(
+		/* [in] */ pvRecord As VoidPtr) As HRESULT
+End Interface
 
 #endif 	/* __IRecordInfo_INTERFACE_DEFINED__ */
-
-#endif ' __UNDEFINED__
 
 
Index: /Include/OleAuto.ab
===================================================================
--- /Include/OleAuto.ab	(revision 210)
+++ /Include/OleAuto.ab	(revision 211)
@@ -24,14 +24,4 @@
 #include <oaidl.ab>
 'Dummy
-Interface IErrorInfo
-	Inherits IUnknown
-End Interface
-
-Interface ICreateErrorInfo
-	Inherits IUnknown
-End Interface
-
-Const Enum SYSKIND
-End Enum
 
 ' BSTR API
Index: /Include/com/currency.ab
===================================================================
--- /Include/com/currency.ab	(revision 210)
+++ /Include/com/currency.ab	(revision 211)
@@ -8,4 +8,8 @@
 Class Currency
 Public
+	Sub Currency()
+		cy = 0
+	End Sub
+
 /*
 	Sub Currency(x As CY)
@@ -201,4 +205,9 @@
 		Return HIDWORD(cy) Xor LODWORD(cy)
 	End Function
+
+	Function Equals(y As Currency) As Boolean
+		Dim c = Compare(This, y)
+		Return c = VARCMP_EQ
+	End Function
 Private
 	cy As CY
Index: /Include/com/decimal.ab
===================================================================
--- /Include/com/decimal.ab	(revision 211)
+++ /Include/com/decimal.ab	(revision 211)
@@ -0,0 +1,188 @@
+' com/decimal.ab
+
+#require <oleauto.ab>
+#require <com/variant.ab>
+
+Class Decimal
+Public
+	Sub Decimal(ByRef d As Decimal)
+		dec = d
+	End Sub
+
+	Const Function Operator +() As Decimal
+		Return New Decimal(dec)
+	End Function
+
+	Const Function Operator -() As Decimal
+		Dim ret = New Decimal
+		VarDecNeg(This.dec, ret.dec)
+		Return ret
+	End Function
+
+	Const Function Operator *(y As Decimal) As Decimal
+		Dim ret = New Decimal
+		VarDecMul(This.dec, y.dec, ret.dec)
+		Return ret
+	End Function
+
+	Const Function Operator *(y As Long) As Decimal
+		Dim ret = New Decimal
+		VarDecMulI4(This.dec, y, ret.dec)
+		Return ret
+	End Function
+
+	Const Function Operator *(y As Int64) As Decimal
+		Dim ret = New Decimal
+		VarDecMulI8(This.dec, y, ret.dec)
+		Return ret
+	End Function
+
+	Const Function Operator /(y As Decimal) As Decimal
+		Dim ret = New Decimal
+		VarDecDiv(This.dec, y.dec, ret.dec)
+		Return ret
+	End Function
+
+	Const Function Operator +(y As Decimal) As Decimal
+		Dim ret = New Decimal
+		VarDecAdd(This.dec, y.dec, ret.dec)
+		Return ret
+	End Function
+
+	Const Function Operator -(y As Decimal) As Decimal
+		Dim ret = New Decimal
+		VarDecSub(This.dec, y.dec, ret.dec)
+		Return ret
+	End Function
+
+	Static Function Compare(x As Decimal, y As Decimal) As HRESULT
+		Return VarDecCmp(x, y)
+	End Function
+
+	Static Function Compare(x As Decimal, y As Double) As HRESULT
+		Return VarDecCmpR8(x, y)
+	End Function
+
+	Static Function Compare(x As Double, y As Decimal) As HRESULT
+		Dim ret = VarDecCmpR8(y, x)
+		Select Case ret
+			Case VARCMP_LT
+				Return VARCMP_GT
+			Case VARCMP_GT
+				Return VARCMP_LT
+			Case Else
+				Return ret
+		End Select
+	End Function
+
+	Const Function Operator ==(y As Decimal) As Boolean
+		Dim c = Compare(This, y)
+		Return c = VARCMP_EQ
+	End Function
+
+	Const Function Operator ==(y As Double) As Boolean
+		Dim c = Compare(This, y)
+		Return c = VARCMP_EQ
+	End Function
+
+	Const Function Operator <>(y As Decimal) As Boolean
+		Dim c = Compare(This, y)
+		Return c <> VARCMP_EQ
+	End Function
+
+	Const Function Operator <>(y As Double) As Boolean
+		Dim c = Compare(This, y)
+		Return c <> VARCMP_EQ
+	End Function
+
+	Const Function Operator <(y As Decimal) As Boolean
+		Dim c = Compare(This, y)
+		Return c = VARCMP_LT
+	End Function
+
+	Const Function Operator <(y As Double) As Boolean
+		Dim c = Compare(This, y)
+		Return c = VARCMP_LT
+	End Function
+/*
+	Const Function Operator >(y As Decimal) As Boolean
+		Dim c = Compare(This, y)
+		Return c = VARCMP_GT
+	End Function
+
+	Const Function Operator >(y As Double) As Boolean
+		Dim c = Compare(This, y)
+		Return c = VARCMP_GT
+	End Function
+*/
+	Const Function Operator <=(y As Decimal) As Boolean
+		Dim c = Compare(This, y)
+		Return result = VARCMP_LT Or result = VARCMP_EQ
+	End Function
+
+	Const Function Operator <=(y As Double) As Boolean
+		Dim c = Compare(This, y)
+		Return result = VARCMP_LT Or result = VARCMP_EQ
+	End Function
+
+	Const Function Operator >=(y As Decimal) As Boolean
+		Dim c = Compare(This, y)
+		Return result = VARCMP_GT Or result = VARCMP_EQ
+	End Function
+
+	Const Function Operator >=(y As Double) As Boolean
+		Dim c = Compare(This, y)
+		Return result = VARCMP_GT Or result = VARCMP_EQ
+	End Function
+
+	Const Function Abs() As Decimal
+		Abs = New Decimal
+		VarDecAbs(This.dec, Abs.dec)
+	End Function
+
+	Const Function Fix() As Decimal
+		Fix = New Decimal
+		VarDecFix(This.dec, Fix.dec)
+	End Function
+
+	Const Function Int() As Decimal
+		Int = New Decimal
+		VarDecInt(This.dec, Int.dec)
+	End Function
+
+	Const Function Round(c = 0 As Long) As Decimal
+		Round = New Decimal
+		VarDecRound(This.dec, c, Round.dec)
+	End Function
+
+	Const Function Dec() As DECIMAL
+		Return dec
+	End Function
+
+	Sub Dec(ByRef d As DECIMAL)
+		dec = d
+	End Sub
+
+	Const Function ToVariant() As Variant
+		Return New Variant(dec)
+	End Function
+
+	Override Function ToString() As String
+		Dim bs As BSTR
+		VarBstrFromDec(dec, LOCALE_USER_DEFAULT, LOCALE_USE_NLS, bs)
+		ToString = New String(bs As PCWSTR, SysStringLen(bs) As Long)
+		SysFreeString(bs)
+	End Function
+
+	Override Function GetHashCode() As Long
+		Dim p = VarPtr(dec) As *DWord
+		Return (p[0] Xor p[1] Xor p[2] Xor p[3]) As Long
+	End Function
+
+	Function Equals(y As Decimal) As Boolean
+		Dim c = Compare(This, y)
+		Return c = VARCMP_EQ
+	End Function
+Private
+	dec As DECIMAL
+End Class
Index: /Include/com/index.ab
===================================================================
--- /Include/com/index.ab	(revision 210)
+++ /Include/com/index.ab	(revision 211)
@@ -5,2 +5,3 @@
 #require <com/vbobject.ab>
 #require <com/currency.ab>
+#require <com/decimal.ab>
Index: /Include/com/variant.ab
===================================================================
--- /Include/com/variant.ab	(revision 210)
+++ /Include/com/variant.ab	(revision 211)
@@ -519,7 +519,13 @@
 
 	Const Function ValCy() As Currency
+		Dim r = ChangeType(VT_CY)
+		ValCy = New Currency
+		ValCy.Cy = GetQWord(VarPtr(r.val))
 	End Function
 
 	Sub ValCy(x As Currency)
+		Clear()
+		SetQWord(VarPtr(v.val), x.Cy)
+		v.vt = VT_CY
 	End Sub
 	
@@ -570,5 +576,16 @@
 	'ValArray
 
-	'ValDecimal
+	Const Function ValDecimal() As Decimal
+		Dim p = VarPtr(v) As *Decimal
+		Return New Deciaml(p[0])
+	End Function
+
+	Sub ValDecimal(x As Decimal)
+		Clear()
+		Dim p = VarPtr(v) As *Decimal
+		p[0] = x.Dec
+		v.vt = VT_DECIMAL '念の為
+	End Sub
+	
 
 	Function PtrToVariant() As *VARIANT
@@ -591,5 +608,4 @@
 	End Sub
 
-
 	Static Sub Move(ByRef dst As VARIANT, ByRef src As VARIANT)
 		dst = src
Index: /Include/objidl.sbp
===================================================================
--- /Include/objidl.sbp	(revision 210)
+++ /Include/objidl.sbp	(revision 211)
@@ -165,9 +165,95 @@
 TypeDef LPSTREAM = *IStream
 
-' IEnumSTATSTG
+Interface IEnumSTATSTG
+	Inherits IUnknown
+End Interface
+
+#ifndef __IStorage_INTERFACE_DEFINED__
+#define __IStorage_INTERFACE_DEFINED__
+
+/* interface IStorage */
+/* [unique][uuid][object] */ 
+
+TypeDef LPSTORAGE = /* [unique] */ *IStorage
+
+Type RemSNB
+	ulCntStr As DWord
+	ulCntChar As DWord
+	rgString[ELM(1)] As OLECHAR
+End Type
+
+TypeDef wireSNB /* [unique] */ = *RemSNB
+
+TypeDef SNB = /* [wire_marshal] */ **OLECHAR
+
+Dim IID_IStorage = [&h0000000b, &h0000, &h0000, [&hC0, &h00, &h00, &h00, &h00, &h00, &h00, &h46]] As IID
 
 Interface IStorage
 	Inherits IUnknown
-End Interface
+
+	Function CreateStream( 
+		/* [string][in] */ pwcsName As *OLECHAR,
+		/* [in] */ grfMode As DWord,
+		/* [in] */ reserved1 As DWord,
+		/* [in] */ reserved2 As DWord,
+		/* [out] */ ByRef pstm As *IStream) As HRESULT
+	/* [local] */ Function OpenStream( 
+		/* [string][in] */ pwcsName As *OLECHAR,
+		/* [unique][in] */ reserved1 As VoidPtr,
+		/* [in] */ grfMode As DWord,
+		/* [in] */ reserved2 As DWord,
+		/* [out] */ ByRef pstm As *IStream) As HRESULT
+	Function CreateStorage( 
+		/* [string][in] */ pwcsName As *OLECHAR,
+		/* [in] */ grfMode As DWord,
+		/* [in] */ reserved1 As DWord,
+		/* [in] */ reserved2 As DWord,
+		/* [out] */ ByRef pstg As *IStorage) As HRESULT
+	Function OpenStorage( 
+		/* [string][unique][in] */ pwcsName As *OLECHAR,
+		/* [unique][in] */ pstgPriority As IStorage,
+		/* [in] */ grfMode As DWord,
+		/* [unique][in] */ snbExclude As SNB,
+		/* [in] */ reserved As DWord,
+		/* [out] */ ByRef pstg As *IStorage) As HRESULT
+	/* [local] */ Function CopyTo( 
+		/* [in] */ ciidExclude As DWord,
+		/* [size_is][unique][in] */ ByRef rgiidExclude As * /*Const*/ IID,
+		/* [unique][in] */ snbExclude As SNB,
+		/* [unique][in] */ pstgDest As *IStorage) As HRESULT
+	Function MoveElementTo( 
+		/* [string][in] */ pwcsName As *OLECHAR,
+		/* [unique][in] */ pstgDest As *IStorage,
+		/* [string][in] */ pwcsNewName As *OLECHAR,
+		/* [in] */ grfFlags As DWord) As HRESULT
+	Function Commit( 
+		/* [in] */ grfCommitFlags As DWord) As HRESULT
+	Function Revert() As HRESULT
+	/* [local] */ Function EnumElements( 
+		/* [in] */ reserved1 As DWord,
+		/* [size_is][unique][in] */ reserved2 As VoidPtr,
+		/* [in] */ reserved3 As DWord,
+		/* [out] */ ByRef penum As *IEnumSTATSTG) As HRESULT
+	Function DestroyElement( 
+		/* [string][in] */ pwcsName As *OLECHAR) As HRESULT
+	Function RenameElement( 
+		/* [string][in] */ pwcsOldName As *OLECHAR,
+		/* [string][in] */ pwcsNewName As *OLECHAR) As HRESULT
+	Function SetElementTimes( 
+            /* [string][unique][in] */ pwcsName As *OLECHAR,
+            /* [unique][in] */ ByRef ctime As /*Const*/ FILETIME,
+            /* [unique][in] */ ByRef atime As /*Const*/ FILETIME,
+            /* [unique][in] */ ByRef mtime As /*Const*/ FILETIME) As HRESULT
+	Function SetClass( 
+            /* [in] */ ByRef clsid As CLSID) As HRESULT
+	Function SetStateBits( 
+            /* [in] */ grfStateBits As DWord,
+            /* [in] */ grfMask As DWord) As HRESULT
+	Function Stat( 
+            /* [out] */ ByRef statstg As STATSTG,
+            /* [in] */ grfStatFlag As DWord) As HRESULT
+End Interface
+
+#endif 	/* __IStorage_INTERFACE_DEFINED__ */
 
 Interface IPersistFile
@@ -175,16 +261,12 @@
 
 	Function IsDirty() As HRESULT
-
 	Function Load(
 		/* [in] */ pszFileName As LPCOLESTR,
 		/* [in] */ dwMode As DWord) As HRESULT
-
 	Function Save(
 		/* [unique][in] */ pszFileName As LPCOLESTR,
 		/* [in] */ fRemember As BOOL) As HRESULT
-
 	Function SaveCompleted(
 		/* [unique][in] */ pszFileName As LPCOLESTR) As HRESULT
-
 	Function GetCurFile(
 		/* [out] */ ByRef pszFileName As LPOLESTR) As HRESULT
Index: /Include/ole2.ab
===================================================================
--- /Include/ole2.ab	(revision 210)
+++ /Include/ole2.ab	(revision 211)
@@ -41,8 +41,8 @@
 End Interface
 
-#include <api_winerror.sbp>
-
-#include <objbase.sbp>
-#include <oleauto.ab>
+#require <api_winerror.sbp>
+
+#require <objbase.sbp>
+#require <oleauto.ab>
 
 ' View OBJECT Error Codes
