source: trunk/Include/com/variant.ab@ 497

Last change on this file since 497 was 478, checked in by イグトランス (egtra), 16 years ago

現在向けに修正(参照型のポインタの排除など)

File size: 12.9 KB
RevLine 
[175]1' com/variant.ab
2
[355]3'#require <com/index.ab>
[175]4
[267]5Namespace ActiveBasic
6Namespace COM
7
[175]8Class Variant
9Public
10 Sub Variant()
11 VariantInit(v)
12 End Sub
13
14 Sub Variant(y As Variant)
15 VariantInit(v)
16 VariantCopy(v, y.v)
17 End Sub
18
[192]19 Sub Variant(ByRef y As VARIANT)
[175]20 VariantInit(v)
21 VariantCopy(v, y)
22 End Sub
23
24 Sub Variant(n As SByte)
25 v.vt = VT_I1
26 SetByte(VarPtr(v.val), n)
27 End Sub
28
29 Sub Variant(n As Byte)
30 v.vt = VT_UI1
31 SetByte(VarPtr(v.val), n)
32 End Sub
33
34 Sub Variant(n As Integer)
35 v.vt = VT_I2
36 SetWord(VarPtr(v.val), n)
37 End Sub
38
39 Sub Variant(n As Word)
40 v.vt = VT_UI2
41 SetWord(VarPtr(v.val), n)
42 End Sub
43
44 Sub Variant(n As Long)
45 v.vt = VT_I4
46 SetDWord(VarPtr(v.val), n)
47 End Sub
48
49 Sub Variant(n As DWord)
50 v.vt = VT_UI4
51 SetDWord(VarPtr(v.val), n)
52 End Sub
53
54 Sub Variant(n As Int64)
55 v.vt = VT_I8
56 SetQWord(VarPtr(v.val), n)
57 End Sub
58
59 Sub Variant(n As QWord)
60 v.vt = VT_UI8
61 SetQWord(VarPtr(v.val), n)
62 End Sub
63
64 Sub Variant(n As Single)
65 v.vt = VT_R4
66 SetSingle(VarPtr(v.val), n)
67 End Sub
68
69 Sub Variant(n As Double)
70 v.vt = VT_R8
71 SetDouble(VarPtr(v.val), n)
72 End Sub
73
74 Sub Variant(bs As BString)
75 v.vt = VT_BSTR
[478]76 SetPointer(VarPtr(v.val), bs.Copy))
[175]77 End Sub
78
[478]79 Sub Variant(unk As IUnknown)
80 If Not IsNothing(unk) Then unk.AddRef()
[175]81 v.vt = VT_UNKNOWN
[478]82 SetPointer(VarPtr(v.val), ObjPtr(unk))
[175]83 End Sub
84
[478]85 Sub Variant(disp As IDispatch)
86 If Not IsNothing(disp) Then disp.AddRef()
[175]87 v.vt = VT_DISPATCH
[478]88 SetPointer(VarPtr(v.val), ObjPtr(disp))
[175]89 End Sub
90/*
91 Sub Variant(b As VARIANT_BOOL)
92 v.vt = VT_BOOL
93 SetWord(VarPtr(v.val), b)
94 End Sub
95*/
96 Sub Variant(b As Boolean)
97 v.vt = VT_BOOL
98 If b Then
99 SetWord(VarPtr(v.val), VARIANT_TRUE)
100 Else
101 SetWord(VarPtr(v.val), VARIANT_FALSE)
102 End If
103 End Sub
104
105 Sub Variant(s As String)
[355]106 ValStr = New BString(s)
[175]107 End Sub
108
[200]109 Sub Variant(n As Currency)
110 v.vt = VT_CY
111 SetQWord(VarPtr(v.val), n.Cy As QWord)
112 End Sub
113
[355]114 Sub Variant(n As Decimal)
115 Dim p = VarPtr(v) As *DECIMAL
116 p[0] = n.Dec
117 v.vt = VT_DECIMAL
118 End Sub
[200]119
[355]120
[175]121 Sub ~Variant()
122 Clear()
123 End Sub
124
125 Sub Clear()
126 VariantClear(v)
127 v.vt = VT_EMPTY
128 End Sub
129
130 Sub Assign(from As Variant)
131 Assign(from.v)
132 End Sub
133
[192]134 Sub Assign(ByRef from As VARIANT)
[175]135 Variant.Copy(v, from)
136 End Sub
137
[192]138 Sub AssignInd(ByRef from As VARIANT)
139 VariantCopyInd(v, from)
140 End Sub
141
[175]142 Sub Attach(ByRef from As VARIANT)
143 Variant.Move(v, from)
144 End Sub
145
[192]146 Const Function Copy() As VARIANT
147 Variant.Copy(Copy, v)
148 End Function
149
[175]150 Function Detach() As VARIANT
151 Variant.Move(Detach, v)
152 End Function
[208]153/*
154 Static Function Assgin(ByRef from As VARIANT) As Variant
155 Assign = New Variant
156 Assgin.Assign(from)
157 End Function
[175]158
[208]159 Static Function Attach(ByRef from As VARIANT) As Variant
160 Attach = New Variant
161 Attach.Attach(from)
162 End Function
163*/
[175]164 'Operators
[355]165/*
[175]166 Const Function Operator ^(y As Variant) As Variant
[208]167 Dim ret = New Variant
[175]168 VarPow(This.v, y.v, ret.v)
169 Return ret
170 End Function
171
[192]172 Const Function Operator +() As Variant
173 Return New Variant(This)
174 End Function
175
176 Const Function Operator -() As Variant
[208]177 Dim ret = New Variant
[175]178 VarNeg(This.v, ret.v)
179 Return ret
180 End Function
181
182 Const Function Operator *(y As Variant) As Variant
[208]183 Dim ret = New Variant
[175]184 VarMul(This.v, y.v, ret.v)
185 Return ret
186 End Function
187
188 Const Function Operator /(y As Variant) As Variant
[208]189 Dim ret = New Variant
[175]190 VarDiv(This.v, y.v, ret.v)
191 Return ret
192 End Function
193
194 Const Function Operator \(y As Variant) As Variant
[208]195 Dim ret = New Variant
[335]196 VarIdiv(This.v, y.v, ret.v)
[175]197 Return ret
198 End Function
199
200 Const Function Operator Mod(y As Variant) As Variant
[208]201 Dim ret = New Variant
[175]202 VarMod(This.v, y.v, ret.v)
203 Return ret
204 End Function
205
206 Const Function Operator +(y As Variant) As Variant
[208]207 Dim ret = New Variant
[175]208 VarAdd(This.v, y.v, ret.v)
209 Return ret
210 End Function
211
212 Const Function Operator -(y As Variant) As Variant
[208]213 Dim ret = New Variant
[175]214 VarSub(This.v, y.v, ret.v)
215 Return ret
216 End Function
217
218 Const Function Operator &(y As Variant) As Variant
[208]219 Dim ret = New Variant
[175]220 VarCat(This.v, y.v, ret.v)
221 Return ret
222 End Function
223
224 Const Function Operator And(y As Variant) As Variant
[208]225 Dim ret = New Variant
[175]226 VarAnd(This.v, y.v, ret.v)
227 Return ret
228 End Function
229
230 Const Function Operator Or(y As Variant) As Variant
[208]231 Dim ret = New Variant
[175]232 VarOr(This.v, y.v, ret.v)
233 Return ret
234 End Function
235
236 Const Function Operator Xor(y As Variant) As Variant
[208]237 Dim ret = New Variant
[175]238 VarXor(This.v, y.v, ret.v)
239 Return ret
240 End Function
241
[192]242 Const Function Operator Not() As Variant
[208]243 Dim ret = New Variant
[175]244 VarNot(This.v, ret.v)
245 Return ret
246 End Function
247
248 Static Function Imp(x As Variant, y As Variant) As Variant
[208]249 Dim ret = New Variant
[175]250 VarImp(x.v, y.v, ret.v)
251 Return ret
252 End Function
253
254 Static Function Eqv(x As Variant, y As Variant) As Variant
[208]255 Dim ret = New Variant
[175]256 VarEqv(x.v, y.v, ret.v)
257 Return ret
258 End Function
[355]259*/
[192]260 Const Function Abs() As Variant
[355]261 Abs = New Variant
262 VarAbs(This.v, Abs.v)
[175]263 End Function
264
[192]265 Const Function Fix() As Variant
[355]266 Fix = New Variant
267 VarFix(This.v, Fix.v)
[175]268 End Function
269
[192]270 Const Function Int() As Variant
[355]271 Int = New Variant
272 VarInt(This.v, Int.v)
[175]273 End Function
274
[355]275 Const Function Round(cDecimals = 0 As Long) As Variant
276 Round = New Variant
277 VarRound(This.v, cDecimals, Round.v)
[175]278 End Function
279
280 Static Function Compare(x As Variant, y As Variant, lcid As LCID, flags As DWord) As HRESULT
[478]281 Return VarCmp(removeNull(x).v, removeNull(y).v, lcid, flags)
[175]282 End Function
283
284 Static Function Compare(x As Variant, y As Variant) As HRESULT
[208]285 Return VarCmp(x.v, y.v, LOCALE_USER_DEFAULT, 0) 'VARCMP_NULL = 3を返す場合があるので注意
[175]286 End Function
[478]287
[175]288 Const Function Operator ==(y As Variant) As Boolean
[192]289 Dim c = Compare(This, y)
[478]290 Return c = VARCMP_EQ
[175]291 End Function
292
293 Const Function Operator <>(y As Variant) As Boolean
[192]294 Dim c = Compare(This, y)
[478]295 Return c <> VARCMP_EQ
[175]296 End Function
297
298 Const Function Operator <(y As Variant) As Boolean
[192]299 Dim c = Compare(This, y)
[478]300 Return c = VARCMP_LT
[175]301 End Function
[478]302
[192]303 Const Function Operator >(y As Variant) As Boolean
304 Dim c = Compare(This, y)
[478]305 Return c = VARCMP_GT
[192]306 End Function
[478]307
[175]308 Const Function Operator <=(y As Variant) As Boolean
[192]309 Dim c = Compare(This, y)
[478]310 Return c = VARCMP_LT Or c = VARCMP_EQ
[175]311 End Function
312
313 Const Function Operator >=(y As Variant) As Boolean
[192]314 Dim c = Compare(This, y)
[478]315 Return c = VARCMP_GT Or c = VARCMP_EQ
[175]316 End Function
[478]317
[175]318 Const Function ChangeType(vt As VARTYPE, flags As Word) As Variant
[478]319 ChangeType = New Variant
320 ChangeType(ChangeType, flags, vt)
[175]321 End Function
322
323 Const Function ChangeType(vt As VARTYPE) As Variant
324 Return ChangeType(vt, 0)
325 End Function
326
327 Const Function ChangeType(ByRef ret As VARIANT, flags As Word, vt As VARTYPE) As HRESULT
328 Return VariantChangeType(ret, v, flags, vt)
329 End Function
330
331 Const Function ChangeType(ByRef ret As Variant, flags As Word, vt As VARTYPE) As HRESULT
332 Return ChangeType(ret.v, flags, vt)
333 End Function
334
335 Const Function VarType() As VARTYPE
336 Return v.vt
337 End Function
338
339 Override Function ToString() As String
[478]340 /*Using*/ Dim bs = ValStr
341 ToString = bs.ToString
342 bstr.Dispose() 'End Using
[175]343 End Function
344
345 Override Function GetHashCode() As Long
346 Dim p = (VarPtr(v) As *DWord)
347 Return (p[0] Xor p[1] Xor p[2] Xor p[3]) As Long
348 End Function
349
350 Const Function ValUI1() As Byte
351 Dim r = ChangeType(VT_UI1)
[335]352 Return GetByte(VarPtr(r.v.val))
[175]353 End Function
354
355 Sub ValUI1(x As Byte)
356 Clear()
357 SetByte(VarPtr(v.val), x)
358 v.vt = VT_UI1
359 End Sub
360
361 Const Function ValUI2() As Word
362 Dim r = ChangeType(VT_UI2)
[335]363 Return GetWord(VarPtr(r.v.val))
[175]364 End Function
365
366 Sub ValUI2(x As Word)
367 Clear()
368 SetWord(VarPtr(v.val), x)
369 v.vt = VT_UI2
370 End Sub
371
372 Const Function ValUI4() As DWord
373 Dim r = ChangeType(VT_UI4)
[335]374 Return GetDWord(VarPtr(r.v.val))
[175]375 End Function
376
377 Sub ValUI4(x As DWord)
378 Clear()
379 SetDWord(VarPtr(v.val), x)
380 v.vt = VT_UI4
381 End Sub
382
383 Const Function ValUI8() As QWord
384 Dim r = ChangeType(VT_UI8)
[335]385 Return GetQWord(VarPtr(r.v.val))
[175]386 End Function
387
388 Sub ValUI8(x As QWord)
389 Clear()
390 SetQWord(VarPtr(v.val), x)
391 v.vt = VT_UI8
392 End Sub
393
394 Const Function ValI1() As SByte
395 Dim r = ChangeType(VT_I1)
[355]396 Return GetByte(VarPtr(r.v.val)) As SByte
[175]397 End Function
398
399 Sub ValI1(x As SByte)
400 Clear()
401 SetByte(VarPtr(v.val), x As Byte)
402 v.vt = VT_I1
403 End Sub
404
405 Const Function ValI2() As Integer
406 Dim r = ChangeType(VT_I2)
[355]407 Return GetWord(VarPtr(r.v.val)) As Integer
[175]408 End Function
409
410 Sub ValI2(x As Integer)
411 Clear()
412 SetWord(VarPtr(v.val), x As Word)
413 v.vt = VT_I2
414 End Sub
415
416 Const Function ValI4() As Long
417 Dim r = ChangeType(VT_I4)
[355]418 Return GetDWord(VarPtr(r.v.val)) As Long
[175]419 End Function
420
421 Sub ValI4(x As Long)
422 Clear()
423 SetDWord(VarPtr(v.val), x As DWord)
424 v.vt = VT_I4
425 End Sub
426
427 Const Function ValI8() As Int64
428 Dim r = ChangeType(VT_I8)
[355]429 Return GetQWord(VarPtr(r.v.val)) As Int64
[175]430 End Function
431
432 Sub ValI8(x As Int64)
433 Clear()
434 SetQWord(VarPtr(v.val), x As QWord)
435 v.vt = VT_I8
436 End Sub
437
438 Const Function ValR4() As Single
439 Dim r = ChangeType(VT_R4)
[355]440 Return GetSingle(VarPtr(r.v.val))
[175]441 End Function
442
443 Sub ValR4(x As Single)
444 Clear()
445 SetDWord(VarPtr(v.val), x)
446 v.vt = VT_R4
447 End Sub
448
449 Const Function ValR8() As Double
450 Dim r = ChangeType(VT_UI8)
[355]451 Return GetDouble(VarPtr(r.v.val))
[175]452 End Function
453
454 Sub ValR8(x As Double)
455 Clear()
456 SetDouble(VarPtr(v.val), x)
457 v.vt = VT_R8
458 End Sub
459
460 Const Function ValBool() As VARIANT_BOOL
461 Dim r = ChangeType(VT_BOOL)
[335]462 Return GetWord(VarPtr(r.v.val))
[175]463 End Function
464
465 Sub ValBool(x As VARIANT_BOOL)
466 Clear()
467 SetWord(VarPtr(v.val), x)
468 v.vt = VT_BOOL
469 End Sub
470
471 Const Function ValError() As SCODE
472 Dim r = ChangeType(VT_ERROR)
[355]473 Return GetDWord(VarPtr(r.v.val))
[175]474 End Function
475
476 Sub ValError(x As SCODE)
477 Clear()
478 SetDWord(VarPtr(v.val), x)
479 v.vt = VT_ERROR
480 End Sub
481
[200]482 Const Function ValCy() As Currency
[211]483 Dim r = ChangeType(VT_CY)
484 ValCy = New Currency
[355]485 ValCy.Cy = GetQWord(VarPtr(r.v.val))
[200]486 End Function
[175]487
[200]488 Sub ValCy(x As Currency)
[211]489 Clear()
490 SetQWord(VarPtr(v.val), x.Cy)
491 v.vt = VT_CY
[200]492 End Sub
493
[175]494 'ValDate
495
[192]496 Const Function ValStr() As BString
[478]497 ValStr = New BString
[175]498 Dim r As VARIANT
[267]499 ChangeType(r, VARIANT_ALPHABOOL, VT_BSTR)
[478]500 ValStr.Attach(GetPointer(VarPtr(r.val)) As BSTR)
[175]501 End Function
502
[192]503 Sub ValStr(x As BString)
[175]504 Clear()
505 v.vt = VT_BSTR
[478]506 If IsNothing(x) Then
507 SetPointer(VarPtr(v.val), SysAllocStringLen(0))
508 Else
509 SetPointer(VarPtr(v.val), x.Copy())
510 End If
[175]511 End Sub
512
[478]513 Const Function ValUnknown() As IUnknown
[175]514 Dim r As VARIANT
515 ChangeType(r, 0, VT_UNKNOWN)
[478]516 Return _System_PtrUnknown(r.val As ULONG_PTR As VoidPtr)
[175]517 End Function
518
[478]519 Sub ValUnknown(x As IUnknown)
[175]520 Clear()
[478]521 SetPointer(VarPtr(v.val), ObjPtr(x))
522 If Not IsNothing(x) Then
523 x.AddRef()
524 End If
[175]525 v.vt = VT_UNKNOWN
526 End Sub
[355]527/*
[175]528 Const Function ValObject() As VBObject
529 Dim r As VARIANT
[192]530 ChangeType(r, 0, VT_DISPATCH)
531 Dim o As VBObject
[175]532 o.Attach(GetPointer(VarPtr(r.val)) As *IDispatch)
533 Return o
534 End Function
535
536 Sub ValObject(x As VBObject)
537 Clear()
538 SetPointer(VarPtr(v.val), x.Copy())
539 x->AddRef()
540 v.vt = VT_DISPATH
541 End Sub
[355]542*/
[175]543 'ValArray
544
[211]545 Const Function ValDecimal() As Decimal
546 Dim p = VarPtr(v) As *Decimal
[355]547 Return New Deciaml(ByVal p)
[211]548 End Function
[175]549
[211]550 Sub ValDecimal(x As Decimal)
551 Clear()
[355]552 Dim p = VarPtr(v) As *DECIMAL
[211]553 p[0] = x.Dec
554 v.vt = VT_DECIMAL '念の為
555 End Sub
556
557
[175]558 Function PtrToVariant() As *VARIANT
559 Return VarPtr(v)
560 End Function
[192]561
[200]562 Static Function OptionalParam() As Variant
[478]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
[200]569 End Function
[478]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
579 End Function
[175]580Private
581 v As VARIANT
582
583 Static Sub Copy(ByRef dst As VARIANT, ByRef src As VARIANT)
584 VariantCopy(dst, src)
585 End Sub
586
587 Static Sub Move(ByRef dst As VARIANT, ByRef src As VARIANT)
588 dst = src
589' src.vt = VT_EMPTY
590 End Sub
[478]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
[175]602End Class
[200]603
[175]604/*
605Function Abs(v As Variant) As Variant
606 Return v.Abs()
607End Function
608
609Function Fix(v As Variant) As Variant
610 Return v.Fix()
611End Function
612
613Function Int(v As Variant) As Variant
614 Return v.Int()
615End Function
616
617Function VarType(v As Variant) As VARTYPE
618 Return v.VarType()
619End Function
620*/
621
[267]622End Namespace 'COM
623End Namespace 'ActiveBasic
Note: See TracBrowser for help on using the repository browser.