Changeset 478 for trunk/Include/com
- Timestamp:
- Mar 13, 2008, 9:06:43 PM (17 years ago)
- Location:
- trunk/Include/com
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Include/com/bstring.ab
r335 r478 1 1 ' com/bstring.ab 2 3 '#require <ole2.ab>4 '#require <oleauto.ab>5 2 6 3 Namespace ActiveBasic … … 8 5 9 6 Class BString 10 'Inherits System.IDisposable, System.ICloneable7 Implements System.IDisposable ', System.ICloneable 11 8 Public 12 9 Sub BString() … … 19 16 20 17 Sub BString(s As BString) 21 BString.Copy(This.bs, s.bs) 22 End Sub 23 24 Sub BString(s As LPCOLESTR) 25 bs = SysAllocString(s) 18 If Not IsNothing(s) Then 19 bs = copy(s.bs) 20 End If 26 21 End Sub 27 22 28 23 Sub BString(s As LPCOLESTR, len As DWord) 29 bs = SysAllocStringLen(s, len) 30 End Sub 31 32 Sub BString(s As PCSTR) 33 Init(s, lstrlenA(s)) 34 End Sub 35 36 Sub BString(s As PCSTR, len As DWord) 37 Dim lenBS = MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, 0, 0) 38 bs = SysAllocStringLen(0, lenBS) 39 MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, bs, lenBS) 24 If s <> 0 Then 25 bs = SysAllocStringLen(s, len) 26 End If 40 27 End Sub 41 28 42 29 Sub BString(s As String) 43 Init(s.StrPtr, s.Length As DWord) 44 End Sub 30 If Not IsNothing(s) Then 31 Init(s.StrPtr, s.Length As DWord) 32 End If 33 End Sub 34 35 Static Function FromBStr(bs As BSTR) As BString 36 FromBStr = New BString(bs, SysStringLen(bs)) 37 End Function 38 39 Static Function FromCStr(s As PCWSTR) As BString 40 If s <> 0 Then 41 FromCStr = New BString(s, lstrlenW(s)) 42 Else 43 FromCStr = New BString 44 End If 45 End Function 46 47 Static Function FromCStr(s As PCWSTR, len As DWord) As BString 48 If s <> 0 Then 49 FromCStr = New BString(s, len) 50 Else 51 FromCStr = New BString 52 End If 53 End Function 54 55 Static Function FromCStr(s As PCSTR) As BString 56 Dim dst As PCWSTR 57 Dim lenW = GetStr(s, dst) 58 FromCStr = FromCStr(s, lenW) 59 End Function 60 61 Static Function FromCStr(s As PCSTR, len As DWord) As BString 62 Dim dst As PCWSTR 63 Dim lenW = GetStr(s, len, dst) 64 FromCStr = FromCStr(s, lenW) 65 End Function 45 66 46 67 Sub ~BString() … … 48 69 End Sub 49 70 50 Sub Assign(bstr As BString)51 Clear()52 BString.Copy(This.bs, bstr.bs)53 End Sub54 55 Sub Assign(s As LPCOLESTR)56 Clear()57 s = SysAllocString(s)58 End Sub59 60 Sub AssignFromBStr(bstr As BSTR)61 Clear()62 BString.Copy(bs, bstr)63 End Sub64 65 71 Const Function Copy() As BSTR 66 BString.Copy(Copy,bs)72 Copy = copy(bs) 67 73 End Function 68 74 … … 76 82 77 83 Sub Clear() 78 If bs <> 0 Then 79 SysFreeString(bs) 80 bs = 0 81 End If 84 reset(0) 82 85 End Sub 83 86 84 87 Sub Attach(ByRef bstr As BSTR) 85 Clear() 86 BString.Move(bs, bstr) 88 reset(move(bstr)) 87 89 End Sub 88 90 89 91 Function Detach() As BSTR 90 BString.Move(Detach,bs)92 Detach = move(bs) 91 93 End Function 92 94 93 95 Function BStr() As BSTR 94 96 BStr = bs 95 End Function96 /*97 Static Function Assgin(bs As BSTR) As BString98 Assgin = New BString99 Assgin.Assgin(bs)100 97 End Function 101 98 … … 104 101 Attach.Attach(bs) 105 102 End Function 106 */ 103 107 104 Const Function Length() As DWord 108 Length = SysStringLen(bs)105 Length = GetDWord(bs As VoidPtr - SizeOf (DWord)) 'SysStringLen(bs) 109 106 End Function 110 107 111 108 Const Function Operator [](i As SIZE_T) As OLECHAR 112 #ifdef _DEBUG113 109 If i > Length Then 114 'Throw OutOfRangeException 115 End If 116 #endif 110 Throw New ArgumentOutOfRangeException("i") 111 End If 117 112 Return bs[i] 118 113 End Function 119 114 120 115 Sub Operator []=(i As SIZE_T, c As OLECHAR) 121 #ifdef _DEBUG122 116 If i > Length Then 123 'Throw OutOfRangeException 124 End If 125 #endif 117 Throw New ArgumentOutOfRangeException("i") 118 End If 126 119 bs[i] = c 127 120 End Sub … … 135 128 End Function 136 129 130 Override Function Equals(o As Object) As Boolean 131 If Not IsNothing(o) Then 132 If This.GetType().Equals(o.GetType()) Then 133 Equals(o As BString) 134 End If 135 End If 136 End Function 137 138 Const Function Equals(s As BString) As Boolean 139 Equals = Compare(This, s) = 0 140 End Function 141 142 Static Function Compare(l As BString, r As BString) As Long 143 If IsNullOrEmpty(l) Then 144 If IsNullOrEmpty(r) Then 145 Compare = 0 146 Else 147 Compare = -1 148 End If 149 Else 150 If IsNullOrEmpty(bsr) Then 151 Compare = 1 152 Else 153 Compare = Strings.ChrCmp(l.bs, l.Length As SIZE_T, r.bs, r.Length As SIZE_T) 154 End If 155 End If 156 End Function 157 158 Static Function IsNullOrEmpty(s As BString) 159 If IsNothing(s) Then 160 IsNullOrEmpty = True 161 ElseIf s.bs = 0 Then 162 IsNullOrEmpty = True 163 ElseIf s.Length = 0 Then 164 IsNullOrEmpty = True 165 Else 166 IsNullOrEmpty = False 167 End If 168 End Function 169 170 Function Operator ==(s As BString) As Boolean 171 Return Compare(This, s) = 0 172 End Function 173 174 Function Operator <>(s As BString) As Boolean 175 Return Compare(This, s) <> 0 176 End Function 177 178 Function Operator <(s As BString) As Boolean 179 Return Compare(This, s) < 0 180 End Function 181 182 Function Operator <=(s As BString) As Boolean 183 Return Compare(This, s) <= 0 184 End Function 185 186 Function Operator >(s As BString) As Boolean 187 Return Compare(This, s) > 0 188 End Function 189 190 Function Operator >=(s As BString) As Boolean 191 Return Compare(This, s) >= 0 192 End Function 193 137 194 Private 138 195 bs As BSTR 139 196 140 Sub Init(s As PCSTR, len As DWord) 141 Dim lenBS = MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, 0, 0) 142 bs = SysAllocStringLen(0, lenBS) 143 MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, bs, lenBS) 144 End Sub 145 146 Static Sub Copy(ByRef dst As BSTR, ByVal src As BSTR) 147 dst = SysAllocStringLen(src, SysStringLen(src)) 148 End Sub 149 150 Static Sub Move(ByRef dst As BSTR, ByRef src As BSTR) 151 dst = src 152 src = 0 153 End Sub 197 Sub init(s As PCSTR, len As DWord) 198 If <> 0 Then 199 Dim lenBS = MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, 0, 0) 200 bs = SysAllocStringLen(0, lenBS) 201 If bs <> 0 Then 202 MultiByteToWideChar(CP_THREAD_ACP, 0, s, len As Long, bs, lenBS) 203 End If 204 End If 205 End Sub 206 207 Sub reset(newBS As BSTR) 208 Dim old = InterlockedExchangePointer(bs, newBS) 209 SysFreeString(old) 210 End Sub 211 212 Static Function copy(src As BSTR) As BSTR 213 copy = SysAllocStringLen(src, SysStringLen(src)) 214 End Function 215 216 Static Function move(ByRef src As BSTR) As BSTR 217 move = InterlockedExchangePointer(src, 0) 218 End Function 154 219 End Class 155 220 -
trunk/Include/com/currency.ab
r355 r478 2 2 3 3 #require <com/variant.ab> 4 5 #ifndef _COM_CURRENCY_AB6 #define _COM_CURRENCY_AB7 4 8 5 Namespace ActiveBasic … … 56 53 Return ret 57 54 End Function 58 /* 55 59 56 Const Function Operator /(y As Variant) As Double 60 57 Dim vx = New Variant(This) … … 69 66 Return ret.ValR8 70 67 End Function 71 */ 68 72 69 Const Function Operator +(y As Currency) As Currency 73 70 Dim ret = New Currency … … 131 128 Return c = VARCMP_LT 132 129 End Function 133 /* 130 134 131 Const Function Operator >(y As Currency) As Boolean 135 132 Dim c = Compare(This, y) … … 141 138 Return c = VARCMP_GT 142 139 End Function 143 */ 140 144 141 Const Function Operator <=(y As Currency) As Boolean 145 142 Dim c = Compare(This, y) … … 183 180 184 181 Const Function Cy() As CY 185 Returncy182 Cy = cy 186 183 End Function 187 184 … … 203 200 204 201 Override Function ToString() As String 205 Dim bs As BSTR 206 VarBstrFromCy(cy, LOCALE_USER_DEFAULT, LOCALE_USE_NLS, bs) 207 ToString = New String(bs As PCWSTR, SysStringLen(bs) As Long) 208 SysFreeString(bs) 202 /*Using*/ Dim bstr = New BString 203 Dim bs As BSTR 204 VarBstrFromCy(cy, LOCALE_USER_DEFAULT, LOCALE_USE_NLS, bs) 205 bstr.Attach(bs) 206 ToString = bstr.ToString 207 bstr.Dispose() 'End Using 209 208 End Function 210 209 … … 223 222 End Namespace 'COM 224 223 End Namespace 'ActiveBasic 225 226 #endif '_COM_CURRENCY_AB -
trunk/Include/com/decimal.ab
r355 r478 1 1 ' com/decimal.ab 2 2 3 '#require <oleauto.ab>4 3 #require <com/variant.ab> 5 4 #require <com/currency.ab> … … 14 13 15 14 Sub Decimal(d As Decimal) 16 ' dec = d なぜかコンパイルできない 17 memcpy(VarPtr(dec), VarPtr(d.dec), Len(dec)) 15 dec = d.dec 18 16 End Sub 19 17 20 18 Sub Decimal(ByRef d As DECIMAL) 21 memcpy(VarPtr(dec), VarPtr(d), Len(dec))19 dec = d 22 20 End Sub 23 21 24 22 Sub Decimal(lo As Long, mid As Long, hi As Long, isNegative As Boolean, scale As Byte) 25 23 If scale > 28 Then 26 Debug 27 Throw New ArgumentOutOfRangeException 24 Throw New ArgumentOutOfRangeException("scale") 28 25 End If 29 26 Dim sign As Byte … … 284 281 Return c = VARCMP_LT 285 282 End Function 286 /* 283 287 284 Const Function Operator >(y As Decimal) As Boolean 288 285 Dim c = Compare(This, y) … … 294 291 Return c = VARCMP_GT 295 292 End Function 296 */ 293 297 294 Const Function Operator <=(y As Decimal) As Boolean 298 295 Dim c = Compare(This, y) … … 348 345 349 346 Override Function ToString() As String 350 Dim bs As BSTR 351 VarBstrFromDec(dec, LOCALE_USER_DEFAULT, LOCALE_USE_NLS, bs) 352 ToString = New String(bs As PCWSTR, SysStringLen(bs) As Long) 353 SysFreeString(bs) 347 /*Using*/ Dim bstr = New BString 348 Dim bs As BSTR 349 VarBstrFromDec(dec, LOCALE_USER_DEFAULT, LOCALE_USE_NLS, bs) 350 bstr.Attach(bs) 351 ToString = bstr.ToString 352 bstr.Dispose() 'End Using 354 353 End Function 355 354 -
trunk/Include/com/variant.ab
r355 r478 1 1 ' com/variant.ab 2 2 3 #ifndef _COM_VARIANT_AB4 #define _COM_VARIANT_AB5 6 '#require <oaidl.ab>7 '#require <oleauto.ab>8 3 '#require <com/index.ab> 9 4 … … 79 74 Sub Variant(bs As BString) 80 75 v.vt = VT_BSTR 81 SetPointer(VarPtr(v.val), SysAllocStringLen(bs.BStr, bs.Length))82 End Sub 83 84 Sub Variant( p As *IUnknown)85 p->AddRef()76 SetPointer(VarPtr(v.val), bs.Copy)) 77 End Sub 78 79 Sub Variant(unk As IUnknown) 80 If Not IsNothing(unk) Then unk.AddRef() 86 81 v.vt = VT_UNKNOWN 87 SetPointer(VarPtr(v.val), p)88 End Sub 89 90 Sub Variant( p As *IDispatch)91 p->AddRef()82 SetPointer(VarPtr(v.val), ObjPtr(unk)) 83 End Sub 84 85 Sub Variant(disp As IDispatch) 86 If Not IsNothing(disp) Then disp.AddRef() 92 87 v.vt = VT_DISPATCH 93 SetPointer(VarPtr(v.val), p)88 SetPointer(VarPtr(v.val), ObjPtr(disp)) 94 89 End Sub 95 90 /* … … 284 279 285 280 Static Function Compare(x As Variant, y As Variant, lcid As LCID, flags As DWord) As HRESULT 286 Return VarCmp( x.v, y.v, lcid, flags)281 Return VarCmp(removeNull(x).v, removeNull(y).v, lcid, flags) 287 282 End Function 288 283 … … 290 285 Return VarCmp(x.v, y.v, LOCALE_USER_DEFAULT, 0) 'VARCMP_NULL = 3を返す場合があるので注意 291 286 End Function 292 /* 287 293 288 Const Function Operator ==(y As Variant) As Boolean 294 289 Dim c = Compare(This, y) 295 If c = VARCMP_EQ Then 296 Return True 297 Else 298 Return False 299 End If 290 Return c = VARCMP_EQ 300 291 End Function 301 292 302 293 Const Function Operator <>(y As Variant) As Boolean 303 294 Dim c = Compare(This, y) 304 If c <> VARCMP_EQ Then 305 Return True 306 Else 307 Return False 308 End If 295 Return c <> VARCMP_EQ 309 296 End Function 310 297 311 298 Const Function Operator <(y As Variant) As Boolean 312 299 Dim c = Compare(This, y) 313 If c = VARCMP_LT Then 314 Return True 315 Else 316 Return False 317 End If 318 End Function 319 /* 300 Return c = VARCMP_LT 301 End Function 302 320 303 Const Function Operator >(y As Variant) As Boolean 321 304 Dim c = Compare(This, y) 322 If c = VARCMP_GT Then 323 Return True 324 Else 325 Return False 326 End If 327 End Function 328 */ 329 /* 305 Return c = VARCMP_GT 306 End Function 307 330 308 Const Function Operator <=(y As Variant) As Boolean 331 309 Dim c = Compare(This, y) 332 If c = VARCMP_LT Or c = VARCMP_EQ Then 333 Return True 334 Else 335 Return False 336 End If 310 Return c = VARCMP_LT Or c = VARCMP_EQ 337 311 End Function 338 312 339 313 Const Function Operator >=(y As Variant) As Boolean 340 314 Dim c = Compare(This, y) 341 If c = VARCMP_GT Or c = VARCMP_EQ Then 342 Return True 343 Else 344 Return False 345 End If 346 End Function 347 */ 315 Return c = VARCMP_GT Or c = VARCMP_EQ 316 End Function 317 348 318 Const Function ChangeType(vt As VARTYPE, flags As Word) As Variant 349 Dim ret = New Variant 350 ChangeType(ret, flags, vt) 351 Return ret 319 ChangeType = New Variant 320 ChangeType(ChangeType, flags, vt) 352 321 End Function 353 322 … … 369 338 370 339 Override Function ToString() As String 371 Dim tmp = ChangeType(VT_BSTR, VARIANT_ALPHABOOL)372 Dim bs = ((tmp.v.val As ULONG_PTR) As BSTR)373 Return New String(bs As PCWSTR, SysStringLen(bs) As Long)340 /*Using*/ Dim bs = ValStr 341 ToString = bs.ToString 342 bstr.Dispose() 'End Using 374 343 End Function 375 344 … … 526 495 527 496 Const Function ValStr() As BString 497 ValStr = New BString 528 498 Dim r As VARIANT 529 499 ChangeType(r, VARIANT_ALPHABOOL, VT_BSTR) 530 Dim bs = New BString 531 bs.Attach(GetPointer(VarPtr(r.val)) As BSTR) 532 Return bs 500 ValStr.Attach(GetPointer(VarPtr(r.val)) As BSTR) 533 501 End Function 534 502 … … 536 504 Clear() 537 505 v.vt = VT_BSTR 538 SetPointer(VarPtr(v.val), x.Copy()) 539 End Sub 540 541 Const Function ValUnknown() As *IUnknown 506 If IsNothing(x) Then 507 SetPointer(VarPtr(v.val), SysAllocStringLen(0)) 508 Else 509 SetPointer(VarPtr(v.val), x.Copy()) 510 End If 511 End Sub 512 513 Const Function ValUnknown() As IUnknown 542 514 Dim r As VARIANT 543 515 ChangeType(r, 0, VT_UNKNOWN) 544 Return GetPointer(VarPtr(r.val)) As *IUnknown 545 End Function 546 547 Sub ValUnknown(x As *IUnknown) 548 Clear() 549 SetPointer(VarPtr(v.val), x) 550 x->AddRef() 516 Return _System_PtrUnknown(r.val As ULONG_PTR As VoidPtr) 517 End Function 518 519 Sub ValUnknown(x As IUnknown) 520 Clear() 521 SetPointer(VarPtr(v.val), ObjPtr(x)) 522 If Not IsNothing(x) Then 523 x.AddRef() 524 End If 551 525 v.vt = VT_UNKNOWN 552 526 End Sub … … 587 561 588 562 Static Function OptionalParam() As Variant 589 ' If _System_VariantOptionalParam = Nothing Then 590 ' 'ToDo マルチスレッド対応 591 VariantOptionalParam = New Variant 592 VariantOptionalParam.ValError = DISP_E_PARAMNOTFOUND 593 ' End If 594 Return VariantOptionalParam 563 If IsNothing(optionalParam) Then 564 Dim t = New Variant 565 t.ValError = DISP_E_PARAMNOTFOUND 566 InterlockedCompareExchangePointer(ByVal VarPtr(optionalParam), ObjPtr(t), 0) 567 End If 568 Return optionalParam 569 End Function 570 571 Static Function Null() As Variant 572 If IsNothing(optionalParam) Then 573 Dim t = New Variant 574 Dim p = t.PtrToVariant 575 p->vt = VT_NULL 576 InterlockedCompareExchangePointer(ByVal VarPtr(optionalParam), ObjPtr(t), 0) 577 End If 578 Return optionalParam 595 579 End Function 596 580 Private … … 605 589 ' src.vt = VT_EMPTY 606 590 End Sub 591 592 Static Function removeNull(v As Variant) As Varinat 593 If IsNothing(v) Then 594 removeNull = Null 595 Else 596 removeNull = v 597 End If 598 End Function 599 600 Static optionalParam = Nothing As Variant 601 Static null = Nothing As Variant 607 602 End Class 608 609 Dim VariantOptionalParam = Nothing As Variant610 603 611 604 /* … … 629 622 End Namespace 'COM 630 623 End Namespace 'ActiveBasic 631 632 #endif '_COM_VARIANT_AB
Note:
See TracChangeset
for help on using the changeset viewer.