Behandlung spezieller COM-Typen in JavaScript

Behandlung spezieller COM-Typen in JavaScript

Variants

Die COM-Methoden werden per IDispatch::Invoke aufgerufen. Die Eingabeparameter und die Ausgabeparameter werden als VARIANT übertragen.

Auch Eingabe-/Ausgabe-Objekte des Skripts werden als VARIANT übergeben.

Ein VARIANT muss in eine JS-Variable konvertiert werden, und aus einer JS-Variable muss ein VARIANT erstellt werden.

Folgende VT_xx Typen werden unterstützt (im wesentlichen alle außer VT_RECORD)

VARIANT Typ

JS Typ

VARIANT Typ

JS Typ

VT_NULL

null

VT_EMPTY

undefined

VT_BOOL

true/false

VT_BSTR

string

VT_DATE

Date()

VT_I1VT_UI1VT_I2VT_UI2VT_I4VT_UI4VT_INTVT_UINTVT_I8VT_UI8VT_R4VT_R8VT_ERRORVT_CYVT_DECIMAL

number

VT_DISPATCHVT_UNKNOWN

object

VARIANT mit dem Flag VT_ARRAY wird als JS-Array (typed oder klassisch) dargestellt.

Arrays

Ein VARIANT kann einen Flag VT_ARRAY haben (dann ist der Inhalt vom VARIANT ein SAFEARRAY). In diesem Fall wird ein JS-Array erstellt.
Andererseits wird ein JS-Array nach VARIANT mit Flag VT_ARRAY konvertiert (dann wird der Inhalt von VARIANT ein SAFEARRAY).

SAFEARRAY → JS-Array

Der Typ von SAFEARRAY-Elementen gibt vor, welcher JS-Array erstellt wird:

vt von SAFEARRAY

JS-Array-Typ

vt von SAFEARRAY

JS-Array-Typ

VT_I1

Int8Array

VT_UI1

Uint8Array

VT_I2

Int16Array

VT_UI2

Uint16Array

VT_I4

Int32Array

VT_UI4

Uint32Array

VT_INT

Int32Array

VT_ERROR

Int32Array

VT_UINT

Uint32Array

VT_I8

BinInt64Array

VT_CY

BinInt64Array

VT_UI8

BigUint64Array

VT_R4

Float32Array

VT_R8

Float64Array

VT_BOOL

[] of boolean

VT_DECIMAL

[] of number

VT_DATE

[] of Date()

VT_BSTR

[] of string

VT_VARIANT

[] of any js value

JS-Array → SAFEARRAY

Der Typ von SAFEARRAY-Elementen wird je nach JS-Array-Typ ermittelt:

JS-Array-Typ

vt von SAFEARRAY

JS-Array-Typ

vt von SAFEARRAY

Int8Array

VT_I1

Uint8Array

VT_UI1

Int16Array

VT_I2

Uint16Array

VT_UI2

Int32Array

VT_I4

Uint32Array

VT_UI4

Int32Array

VT_INT

Int32Array

VT_ERROR

Uint32Array

VT_UINT

BinInt64Array

VT_I8

BigUint64Array

VT_UI8

Float32Array

VT_R4

Float64Array

VT_R8

[]Array

VT_VARIANT

Numbers

VARIANT → JS-Number

JS implementiert die Numbers als IEEE-754 double precision numbers. Integerwerte +/-9007199254740991 sind sogenannte Safe Integers, also maximale Integers, die bei IEEE-754 korrekte Integer-Semantik haben.

vt

Literal in c++

JS-Number (toString)

vt

Literal in c++

JS-Number (toString)

VT_I1

-128

-128

VT_I1

-127

-127

VT_I1

-1

-1

VT_I1

0

0

VT_I1

1

1

VT_I1

127

127

VT_UI1

0

0

VT_UI1

1

1

VT_UI1

127

127

VT_UI1

128

128

VT_UI1

129

129

VT_UI1

255

255

VT_I2

-32768

-32768

VT_I2

-32767

-32767

VT_I2

-1

-1

VT_I2

0

0

VT_I2

1

1

VT_I2

32767

32767

VT_UI2

0

0

VT_UI2

1

1

VT_UI2

32767

32767

VT_UI2

32768

32768

VT_UI2

65535

65535

VT_I4

-2147483647i32 - 1

-2147483648

VT_I4

-2147483647i32

-2147483647

VT_I4

-1

-1

VT_I4

0

0

VT_I4

1

1

VT_I4

2147483647

2147483647

VT_UI4

0

0

VT_UI4

1

1

VT_UI4

2147483647

2147483647

VT_UI4

2147483648

2147483648

VT_UI4

4294967295

4294967295

VT_INT

-2147483647i32 - 1

-2147483648

VT_INT

-2147483647i32

-2147483647

VT_INT

-1

-1

VT_INT

0

0

VT_INT

1

1

VT_INT

2147483647

2147483647

VT_UINT

0

0

VT_UINT

1

1

VT_UINT

2147483647

2147483647

VT_UINT

2147483648

2147483648

VT_UINT

4294967295

4294967295

VT_I8

-9223372036854775807LL - 1

-9223372036854776000

VT_I8

-9007199254740993LL

-9007199254740992

VT_I8

-9007199254740992LL

-9007199254740992

VT_I8

-9007199254740991LL

-9007199254740991

VT_I8

-9007199254740990LL

-9007199254740990

VT_I8

-9007199254740989LL

-9007199254740989

VT_I8

-2147483649LL

-2147483649

VT_I8

-2147483648LL

-2147483648

VT_I8

-2147483647LL

-2147483647

VT_I8

-1

-1

VT_I8

0

0

VT_I8

1

1

VT_I8

2147483647LL

2147483647

VT_I8

2147483648LL

2147483648

VT_I8

4294967295LL

4294967295

VT_I8

4294967296LL

4294967296

VT_I8

9007199254740989LL

9007199254740989

VT_I8

9007199254740990LL

9007199254740990

VT_I8

9007199254740991LL

9007199254740991

VT_I8

9007199254740992LL

9007199254740992

VT_I8

9007199254740993LL

9007199254740992

VT_I8

9223372036854775807LL

9223372036854776000

VT_UI8

0

0

VT_UI8

1

1

VT_UI8

2147483647LL

2147483647

VT_UI8

2147483648LL

2147483648

VT_UI8

4294967295LL

4294967295

VT_UI8

4294967296LL

4294967296

VT_UI8

9007199254740989LL

9007199254740989

VT_UI8

9007199254740990LL

9007199254740990

VT_UI8

9007199254740991LL

9007199254740991

VT_UI8

9007199254740992LL

9007199254740992

VT_UI8

9007199254740993LL

9007199254740992

VT_UI8

9223372036854775807LL

9223372036854776000

VT_UI8

9223372036854775808ULL

9223372036854776000

VT_UI8

18446744073709551615ULL

18446744073709552000

VT_R4

-1222333444555.0f

-1222333431808

VT_R4

-1222333444.0f

-1222333440

VT_R4

-1222333.0f

-1222333

VT_R4

-1222.0f

-1222

VT_R4

0,0f

0

VT_R4

1222.0f

1222

VT_R4

1222333.0f

1222333

VT_R4

1222333444.0f

1222333440

VT_R4

1222333444555.0f

1222333431808

VT_R4

1.0e+33f

9.999999944957273e+32

VT_R4

1.0e-33f

1.000000023742228e-33

VT_R8

-1222333444555666777888.0

-1.222333444555667e+21

VT_R8

-1222333444555666777.0

-1222333444555666700

VT_R8

-1222333444555666.0

-1222333444555666

VT_R8

-1222333444555.0

-1222333444555

VT_R8

-1222333444.0

-1222333444

VT_R8

-1222333.0

-1222333

VT_R8

-1222.0

-1222

VT_R8

0,0

0

VT_R8

1222.0

1222

VT_R8

1222333.0

1222333

VT_R8

1222333444.0

1222333444

VT_R8

1222333444555.0

1222333444555

VT_R8

1222333444555666.0

1222333444555666

VT_R8

1222333444555666777.0

1222333444555666700

VT_R8

1222333444555666777888.0