Przeglądaj źródła

* fixed several range check errors inside variant helpers in case the
rtl is compiled with range checking on (Delphi doesn't give range
errors there either)

git-svn-id: trunk@7513 -

Jonas Maebe 18 lat temu
rodzic
commit
480af93606
1 zmienionych plików z 114 dodań i 114 usunięć
  1. 114 114
      rtl/objpas/cvarutil.inc

+ 114 - 114
rtl/objpas/cvarutil.inc

@@ -87,18 +87,18 @@ begin
         varEmpty    : Result := 0;
         varEmpty    : Result := 0;
         varSmallInt : Result := vSmallInt;
         varSmallInt : Result := vSmallInt;
         varShortInt : Result := vShortInt;
         varShortInt : Result := vShortInt;
-        varInteger  : Result := vInteger;
-        varSingle   : Result := Round(vSingle);
-        varDouble   : Result := Round(vDouble);
-        varCurrency : Result := Round(vCurrency);
-        varDate     : Result := Round(vDate);
-        varBoolean  : Result := SmallInt(vBoolean);
+        varInteger  : Result := smallint(vInteger);
+        varSingle   : Result := smallint(Round(vSingle));
+        varDouble   : Result := smallint(Round(vDouble));
+        varCurrency : Result := smallint(Round(vCurrency));
+        varDate     : Result := smallint(Round(vDate));
+        varBoolean  : Result := smallint(SmallInt(vBoolean));
         varVariant  : Result := VariantToSmallInt(PVarData(vPointer)^);
         varVariant  : Result := VariantToSmallInt(PVarData(vPointer)^);
         varByte     : Result := vByte;
         varByte     : Result := vByte;
-        varWord     : Result := vWord;
-        varLongWord : Result := vLongWord;
-        varInt64    : Result := vInt64;
-        varQword    : Result := vQWord;
+        varWord     : Result := smallint(vWord);
+        varLongWord : Result := smallint(vLongWord);
+        varInt64    : Result := smallint(vInt64);
+        varQword    : Result := smallint(vQWord);
         varOleStr   : Result := WStrToSmallInt(vOleStr);
         varOleStr   : Result := WStrToSmallInt(vOleStr);
         varString   : Result := LStrToSmallInt(vString);
         varString   : Result := LStrToSmallInt(vString);
       else
       else
@@ -107,18 +107,18 @@ begin
       varByRef: if Assigned(vPointer) then case vType of
       varByRef: if Assigned(vPointer) then case vType of
         varSmallInt : Result := PSmallInt(vPointer)^;
         varSmallInt : Result := PSmallInt(vPointer)^;
         varShortInt : Result := PShortInt(vPointer)^;
         varShortInt : Result := PShortInt(vPointer)^;
-        varInteger  : Result := PInteger(vPointer)^;
-        varSingle   : Result := Round(PSingle(vPointer)^);
-        varDouble   : Result := Round(PDouble(vPointer)^);
-        varCurrency : Result := Round(PCurrency(vPointer)^);
-        varDate     : Result := Round(PDate(vPointer)^);
+        varInteger  : Result := smallint(PInteger(vPointer)^);
+        varSingle   : Result := smallint(Round(PSingle(vPointer)^));
+        varDouble   : Result := smallint(Round(PDouble(vPointer)^));
+        varCurrency : Result := smallint(Round(PCurrency(vPointer)^));
+        varDate     : Result := smallint(Round(PDate(vPointer)^));
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varVariant  : Result := VariantToSmallInt(PVarData(vPointer)^);
         varVariant  : Result := VariantToSmallInt(PVarData(vPointer)^);
         varByte     : Result := PByte(vPointer)^;
         varByte     : Result := PByte(vPointer)^;
-        varWord     : Result := PWord(vPointer)^;
-        varLongWord : Result := PLongWord(vPointer)^;
-        varInt64    : Result := PInt64(vPointer)^;
-        varQword    : Result := PQWord(vPointer)^;
+        varWord     : Result := smallint(PWord(vPointer)^);
+        varLongWord : Result := smallint(PLongWord(vPointer)^);
+        varInt64    : Result := smallint(PInt64(vPointer)^);
+        varQword    : Result := smallint(PQWord(vPointer)^);
         varOleStr   : Result := WStrToSmallInt(PPointer(vPointer)^);
         varOleStr   : Result := WStrToSmallInt(PPointer(vPointer)^);
         varString   : Result := LStrToSmallInt(PPointer(vPointer)^);
         varString   : Result := LStrToSmallInt(PPointer(vPointer)^);
       else { other vtype }
       else { other vtype }
@@ -164,40 +164,40 @@ begin
     case vType and not varTypeMask of
     case vType and not varTypeMask of
       0: case vType of
       0: case vType of
         varEmpty    : Result := 0;
         varEmpty    : Result := 0;
-        varSmallInt : Result := vSmallInt;
+        varSmallInt : Result := shortint(vSmallInt);
         varShortInt : Result := vShortInt;
         varShortInt : Result := vShortInt;
-        varInteger  : Result := vInteger;
-        varSingle   : Result := Round(vSingle);
-        varDouble   : Result := Round(vDouble);
-        varCurrency : Result := Round(vCurrency);
-        varDate     : Result := Round(vDate);
+        varInteger  : Result := shortint(vInteger);
+        varSingle   : Result := shortint(Round(vSingle));
+        varDouble   : Result := shortint(Round(vDouble));
+        varCurrency : Result := shortint(Round(vCurrency));
+        varDate     : Result := shortint(Round(vDate));
         varBoolean  : Result := SmallInt(vBoolean);
         varBoolean  : Result := SmallInt(vBoolean);
         varVariant  : Result := VariantToShortInt(PVarData(vPointer)^);
         varVariant  : Result := VariantToShortInt(PVarData(vPointer)^);
-        varByte     : Result := vByte;
-        varWord     : Result := vWord;
-        varLongWord : Result := vLongWord;
-        varInt64    : Result := vInt64;
-        varQword    : Result := vQWord;
+        varByte     : Result := shortint(vByte);
+        varWord     : Result := shortint(vWord);
+        varLongWord : Result := shortint(vLongWord);
+        varInt64    : Result := shortint(vInt64);
+        varQword    : Result := shortint(vQWord);
         varOleStr   : Result := WStrToShortInt(vOleStr);
         varOleStr   : Result := WStrToShortInt(vOleStr);
         varString   : Result := LStrToShortInt(vString);
         varString   : Result := LStrToShortInt(vString);
       else
       else
         VariantTypeMismatch(vType, varShortInt);
         VariantTypeMismatch(vType, varShortInt);
       end;
       end;
       varByRef: if Assigned(vPointer) then case vType of
       varByRef: if Assigned(vPointer) then case vType of
-        varSmallInt : Result := PSmallInt(vPointer)^;
+        varSmallInt : Result := shortint(PSmallInt(vPointer)^);
         varShortInt : Result := PShortInt(vPointer)^;
         varShortInt : Result := PShortInt(vPointer)^;
-        varInteger  : Result := PInteger(vPointer)^;
-        varSingle   : Result := Round(PSingle(vPointer)^);
-        varDouble   : Result := Round(PDouble(vPointer)^);
-        varCurrency : Result := Round(PCurrency(vPointer)^);
-        varDate     : Result := Round(PDate(vPointer)^);
+        varInteger  : Result := shortint(PInteger(vPointer)^);
+        varSingle   : Result := shortint(Round(PSingle(vPointer)^));
+        varDouble   : Result := shortint(Round(PDouble(vPointer)^));
+        varCurrency : Result := shortint(Round(PCurrency(vPointer)^));
+        varDate     : Result := shortint(Round(PDate(vPointer)^));
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varVariant  : Result := VariantToShortInt(PVarData(vPointer)^);
         varVariant  : Result := VariantToShortInt(PVarData(vPointer)^);
-        varByte     : Result := PByte(vPointer)^;
-        varWord     : Result := PWord(vPointer)^;
-        varLongWord : Result := PLongWord(vPointer)^;
-        varInt64    : Result := PInt64(vPointer)^;
-        varQword    : Result := PQWord(vPointer)^;
+        varByte     : Result := shortint(PByte(vPointer)^);
+        varWord     : Result := shortint(PWord(vPointer)^);
+        varLongWord : Result := shortint(PLongWord(vPointer)^);
+        varInt64    : Result := shortint(PInt64(vPointer)^);
+        varQword    : Result := shortint(PQWord(vPointer)^);
         varOleStr   : Result := WStrToShortInt(PPointer(vPointer)^);
         varOleStr   : Result := WStrToShortInt(PPointer(vPointer)^);
         varString   : Result := LStrToShortInt(PPointer(vPointer)^);
         varString   : Result := LStrToShortInt(PPointer(vPointer)^);
       else { other vtype }
       else { other vtype }
@@ -246,17 +246,17 @@ begin
         varSmallInt : Result := vSmallInt;
         varSmallInt : Result := vSmallInt;
         varShortInt : Result := vShortInt;
         varShortInt : Result := vShortInt;
         varInteger  : Result := vInteger;
         varInteger  : Result := vInteger;
-        varSingle   : Result := Round(vSingle);
-        varDouble   : Result := Round(vDouble);
-        varCurrency : Result := Round(vCurrency);
-        varDate     : Result := Round(vDate);
+        varSingle   : Result := longint(Round(vSingle));
+        varDouble   : Result := longint(Round(vDouble));
+        varCurrency : Result := longint(Round(vCurrency));
+        varDate     : Result := longint(Round(vDate));
         varBoolean  : Result := SmallInt(vBoolean);
         varBoolean  : Result := SmallInt(vBoolean);
         varVariant  : Result := VariantToLongInt(PVarData(vPointer)^);
         varVariant  : Result := VariantToLongInt(PVarData(vPointer)^);
         varByte     : Result := vByte;
         varByte     : Result := vByte;
         varWord     : Result := vWord;
         varWord     : Result := vWord;
-        varLongWord : Result := vLongWord;
-        varInt64    : Result := vInt64;
-        varQword    : Result := vQWord;
+        varLongWord : Result := longint(vLongWord);
+        varInt64    : Result := longint(vInt64);
+        varQword    : Result := longint(vQWord);
         varOleStr   : Result := WStrToLongInt(vOleStr);
         varOleStr   : Result := WStrToLongInt(vOleStr);
         varString   : Result := LStrToLongInt(vString);
         varString   : Result := LStrToLongInt(vString);
       else
       else
@@ -266,17 +266,17 @@ begin
         varSmallInt : Result := PSmallInt(vPointer)^;
         varSmallInt : Result := PSmallInt(vPointer)^;
         varShortInt : Result := PShortInt(vPointer)^;
         varShortInt : Result := PShortInt(vPointer)^;
         varInteger  : Result := PInteger(vPointer)^;
         varInteger  : Result := PInteger(vPointer)^;
-        varSingle   : Result := Round(PSingle(vPointer)^);
-        varDouble   : Result := Round(PDouble(vPointer)^);
-        varCurrency : Result := Round(PCurrency(vPointer)^);
-        varDate     : Result := Round(PDate(vPointer)^);
+        varSingle   : Result := longint(Round(PSingle(vPointer)^));
+        varDouble   : Result := longint(Round(PDouble(vPointer)^));
+        varCurrency : Result := longint(Round(PCurrency(vPointer)^));
+        varDate     : Result := longint(Round(PDate(vPointer)^));
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varVariant  : Result := VariantToLongInt(PVarData(vPointer)^);
         varVariant  : Result := VariantToLongInt(PVarData(vPointer)^);
         varByte     : Result := PByte(vPointer)^;
         varByte     : Result := PByte(vPointer)^;
         varWord     : Result := PWord(vPointer)^;
         varWord     : Result := PWord(vPointer)^;
-        varLongWord : Result := PLongWord(vPointer)^;
-        varInt64    : Result := PInt64(vPointer)^;
-        varQword    : Result := PQWord(vPointer)^;
+        varLongWord : Result := longint(PLongWord(vPointer)^);
+        varInt64    : Result := longint(PInt64(vPointer)^);
+        varQword    : Result := longint(PQWord(vPointer)^);
         varOleStr   : Result := WStrToLongInt(PPointer(vPointer)^);
         varOleStr   : Result := WStrToLongInt(PPointer(vPointer)^);
         varString   : Result := LStrToLongInt(PPointer(vPointer)^);
         varString   : Result := LStrToLongInt(PPointer(vPointer)^);
       else { other vtype }
       else { other vtype }
@@ -324,38 +324,38 @@ begin
         varEmpty    : Result := 0;
         varEmpty    : Result := 0;
         varSmallInt : Result := vSmallInt;
         varSmallInt : Result := vSmallInt;
         varShortInt : Result := vShortInt;
         varShortInt : Result := vShortInt;
-        varInteger  : Result := vInteger;
-        varSingle   : Result := Round(vSingle);
-        varDouble   : Result := Round(vDouble);
-        varCurrency : Result := Round(vCurrency);
-        varDate     : Result := Round(vDate);
+        varInteger  : Result := cardinal(vInteger);
+        varSingle   : Result := cardinal(Round(vSingle));
+        varDouble   : Result := cardinal(Round(vDouble));
+        varCurrency : Result := cardinal(Round(vCurrency));
+        varDate     : Result := cardinal(Round(vDate));
         varBoolean  : Result := SmallInt(vBoolean);
         varBoolean  : Result := SmallInt(vBoolean);
         varVariant  : Result := VariantToCardinal(PVarData(vPointer)^);
         varVariant  : Result := VariantToCardinal(PVarData(vPointer)^);
         varByte     : Result := vByte;
         varByte     : Result := vByte;
         varWord     : Result := vWord;
         varWord     : Result := vWord;
         varLongWord : Result := vLongWord;
         varLongWord : Result := vLongWord;
-        varInt64    : Result := vInt64;
-        varQword    : Result := vQWord;
+        varInt64    : Result := cardinal(vInt64);
+        varQword    : Result := cardinal(vQWord);
         varOleStr   : Result := WStrToCardinal(vOleStr);
         varOleStr   : Result := WStrToCardinal(vOleStr);
         varString   : Result := LStrToCardinal(vString);
         varString   : Result := LStrToCardinal(vString);
       else
       else
         VariantTypeMismatch(vType, varLongWord);
         VariantTypeMismatch(vType, varLongWord);
       end;
       end;
       varByRef: if Assigned(vPointer) then case vType of
       varByRef: if Assigned(vPointer) then case vType of
-        varSmallInt : Result := PSmallInt(vPointer)^;
-        varShortInt : Result := PShortInt(vPointer)^;
-        varInteger  : Result := PInteger(vPointer)^;
-        varSingle   : Result := Round(PSingle(vPointer)^);
-        varDouble   : Result := Round(PDouble(vPointer)^);
-        varCurrency : Result := Round(PCurrency(vPointer)^);
-        varDate     : Result := Round(PDate(vPointer)^);
+        varSmallInt : Result := cardinal(PSmallInt(vPointer)^);
+        varShortInt : Result := cardinal(PShortInt(vPointer)^);
+        varInteger  : Result := cardinal(PInteger(vPointer)^);
+        varSingle   : Result := cardinal(Round(PSingle(vPointer)^));
+        varDouble   : Result := cardinal(Round(PDouble(vPointer)^));
+        varCurrency : Result := cardinal(Round(PCurrency(vPointer)^));
+        varDate     : Result := cardinal(Round(PDate(vPointer)^));
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varVariant  : Result := VariantToCardinal(PVarData(vPointer)^);
         varVariant  : Result := VariantToCardinal(PVarData(vPointer)^);
         varByte     : Result := PByte(vPointer)^;
         varByte     : Result := PByte(vPointer)^;
         varWord     : Result := PWord(vPointer)^;
         varWord     : Result := PWord(vPointer)^;
         varLongWord : Result := PLongWord(vPointer)^;
         varLongWord : Result := PLongWord(vPointer)^;
-        varInt64    : Result := PInt64(vPointer)^;
-        varQword    : Result := PQWord(vPointer)^;
+        varInt64    : Result := cardinal(PInt64(vPointer)^);
+        varQword    : Result := cardinal(PQWord(vPointer)^);
         varOleStr   : Result := WStrToCardinal(PPointer(vPointer)^);
         varOleStr   : Result := WStrToCardinal(PPointer(vPointer)^);
         varString   : Result := LStrToCardinal(PPointer(vPointer)^);
         varString   : Result := LStrToCardinal(PPointer(vPointer)^);
       else { other vtype }
       else { other vtype }
@@ -660,7 +660,7 @@ begin
         varWord     : Result := vWord;
         varWord     : Result := vWord;
         varLongWord : Result := vLongWord;
         varLongWord : Result := vLongWord;
         varInt64    : Result := vInt64;
         varInt64    : Result := vInt64;
-        varQword    : Result := vQWord;
+        varQword    : Result := currency(vQWord);
         varOleStr   : Result := WStrToCurrency(vOleStr);
         varOleStr   : Result := WStrToCurrency(vOleStr);
         varString   : Result := LStrToCurrency(vString);
         varString   : Result := LStrToCurrency(vString);
       else
       else
@@ -692,7 +692,7 @@ begin
         varWord     : Result := PWord(vPointer)^;
         varWord     : Result := PWord(vPointer)^;
         varLongWord : Result := PLongWord(vPointer)^;
         varLongWord : Result := PLongWord(vPointer)^;
         varInt64    : Result := PInt64(vPointer)^;
         varInt64    : Result := PInt64(vPointer)^;
-        varQword    : Result := PQWord(vPointer)^;
+        varQword    : Result := currency(PQWord(vPointer)^);
         varOleStr   : Result := WStrToCurrency(PPointer(vPointer)^);
         varOleStr   : Result := WStrToCurrency(PPointer(vPointer)^);
         varString   : Result := LStrToCurrency(PPointer(vPointer)^);
         varString   : Result := LStrToCurrency(PPointer(vPointer)^);
       else { other vtype }
       else { other vtype }
@@ -894,40 +894,40 @@ begin
     case vType and not varTypeMask of
     case vType and not varTypeMask of
       0: case vType of
       0: case vType of
         varEmpty    : Result := 0;
         varEmpty    : Result := 0;
-        varSmallInt : Result := vSmallInt;
-        varShortInt : Result := vShortInt;
-        varInteger  : Result := vInteger;
-        varSingle   : Result := Round(vSingle);
-        varDouble   : Result := Round(vDouble);
-        varCurrency : Result := Round(vCurrency);
-        varDate     : Result := Round(vDate);
+        varSmallInt : Result := byte(vSmallInt);
+        varShortInt : Result := byte(vShortInt);
+        varInteger  : Result := byte(vInteger);
+        varSingle   : Result := byte(Round(vSingle));
+        varDouble   : Result := byte(Round(vDouble));
+        varCurrency : Result := byte(Round(vCurrency));
+        varDate     : Result := byte(Round(vDate));
         varBoolean  : Result := SmallInt(vBoolean);
         varBoolean  : Result := SmallInt(vBoolean);
         varVariant  : Result := VariantToByte(PVarData(vPointer)^);
         varVariant  : Result := VariantToByte(PVarData(vPointer)^);
         varByte     : Result := vByte;
         varByte     : Result := vByte;
-        varWord     : Result := vWord;
-        varLongWord : Result := vLongWord;
-        varInt64    : Result := vInt64;
-        varQword    : Result := vQWord;
+        varWord     : Result := byte(vWord);
+        varLongWord : Result := byte(vLongWord);
+        varInt64    : Result := byte(vInt64);
+        varQword    : Result := byte(vQWord);
         varOleStr   : Result := WStrToByte(vOleStr);
         varOleStr   : Result := WStrToByte(vOleStr);
         varString   : Result := LStrToByte(vString);
         varString   : Result := LStrToByte(vString);
       else
       else
         VariantTypeMismatch(vType, varByte);
         VariantTypeMismatch(vType, varByte);
       end;
       end;
       varByRef: if Assigned(vPointer) then case vType of
       varByRef: if Assigned(vPointer) then case vType of
-        varSmallInt : Result := PSmallInt(vPointer)^;
-        varShortInt : Result := PShortInt(vPointer)^;
-        varInteger  : Result := PInteger(vPointer)^;
-        varSingle   : Result := Round(PSingle(vPointer)^);
-        varDouble   : Result := Round(PDouble(vPointer)^);
-        varCurrency : Result := Round(PCurrency(vPointer)^);
-        varDate     : Result := Round(PDate(vPointer)^);
-        varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
-        varVariant  : Result := VariantToByte(PVarData(vPointer)^);
+        varSmallInt : Result := byte(PSmallInt(vPointer)^);
+        varShortInt : Result := byte(PShortInt(vPointer)^);
+        varInteger  : Result := byte(PInteger(vPointer)^);
+        varSingle   : Result := byte(Round(PSingle(vPointer)^));
+        varDouble   : Result := byte(Round(PDouble(vPointer)^));
+        varCurrency : Result := byte(Round(PCurrency(vPointer)^));
+        varDate     : Result := byte(Round(PDate(vPointer)^));
+        varBoolean  : Result := byte(SmallInt(PWordBool(vPointer)^));
+        varVariant  : Result := byte(VariantToByte(PVarData(vPointer)^));
         varByte     : Result := PByte(vPointer)^;
         varByte     : Result := PByte(vPointer)^;
-        varWord     : Result := PWord(vPointer)^;
-        varLongWord : Result := PLongWord(vPointer)^;
-        varInt64    : Result := PInt64(vPointer)^;
-        varQword    : Result := PQWord(vPointer)^;
+        varWord     : Result := byte(PWord(vPointer)^);
+        varLongWord : Result := byte(PLongWord(vPointer)^);
+        varInt64    : Result := byte(PInt64(vPointer)^);
+        varQword    : Result := byte(PQWord(vPointer)^);
         varOleStr   : Result := WStrToByte(PPointer(vPointer)^);
         varOleStr   : Result := WStrToByte(PPointer(vPointer)^);
         varString   : Result := LStrToByte(PPointer(vPointer)^);
         varString   : Result := LStrToByte(PPointer(vPointer)^);
       else { other vtype }
       else { other vtype }
@@ -986,7 +986,7 @@ begin
         varWord     : Result := vWord;
         varWord     : Result := vWord;
         varLongWord : Result := vLongWord;
         varLongWord : Result := vLongWord;
         varInt64    : Result := vInt64;
         varInt64    : Result := vInt64;
-        varQword    : Result := vQWord;
+        varQword    : Result := int64(vQWord);
         varOleStr   : Result := WStrToInt64(vOleStr);
         varOleStr   : Result := WStrToInt64(vOleStr);
         varString   : Result := LStrToInt64(vString);
         varString   : Result := LStrToInt64(vString);
       else
       else
@@ -1052,19 +1052,19 @@ begin
     case vType and not varTypeMask of
     case vType and not varTypeMask of
       0: case vType of
       0: case vType of
         varEmpty    : Result := 0;
         varEmpty    : Result := 0;
-        varSmallInt : Result := vSmallInt;
-        varShortInt : Result := vShortInt;
-        varInteger  : Result := vInteger;
-        varSingle   : Result := Round(vSingle);
-        varDouble   : Result := Round(vDouble);
-        varCurrency : Result := Round(vCurrency);
-        varDate     : Result := Round(vDate);
+        varSmallInt : Result := qword(vSmallInt);
+        varShortInt : Result := qword(vShortInt);
+        varInteger  : Result := qword(vInteger);
+        varSingle   : Result := qword(Round(vSingle));
+        varDouble   : Result := qword(Round(vDouble));
+        varCurrency : Result := qword(Round(vCurrency));
+        varDate     : Result := qword(Round(vDate));
         varBoolean  : Result := SmallInt(vBoolean);
         varBoolean  : Result := SmallInt(vBoolean);
         varVariant  : Result := VariantToQWord(PVarData(vPointer)^);
         varVariant  : Result := VariantToQWord(PVarData(vPointer)^);
         varByte     : Result := vByte;
         varByte     : Result := vByte;
         varWord     : Result := vWord;
         varWord     : Result := vWord;
         varLongWord : Result := vLongWord;
         varLongWord : Result := vLongWord;
-        varInt64    : Result := vInt64;
+        varInt64    : Result := qword(vInt64);
         varQword    : Result := vQWord;
         varQword    : Result := vQWord;
         varOleStr   : Result := WStrToQWord(vOleStr);
         varOleStr   : Result := WStrToQWord(vOleStr);
         varString   : Result := LStrToQWord(vString);
         varString   : Result := LStrToQWord(vString);
@@ -1072,19 +1072,19 @@ begin
         VariantTypeMismatch(vType, varQWord);
         VariantTypeMismatch(vType, varQWord);
       end;
       end;
       varByRef: if Assigned(vPointer) then case vType of
       varByRef: if Assigned(vPointer) then case vType of
-        varSmallInt : Result := PSmallInt(vPointer)^;
-        varShortInt : Result := PShortInt(vPointer)^;
-        varInteger  : Result := PInteger(vPointer)^;
-        varSingle   : Result := Round(PSingle(vPointer)^);
-        varDouble   : Result := Round(PDouble(vPointer)^);
-        varCurrency : Result := Round(PCurrency(vPointer)^);
-        varDate     : Result := Round(PDate(vPointer)^);
+        varSmallInt : Result := qword(PSmallInt(vPointer)^);
+        varShortInt : Result := qword(PShortInt(vPointer)^);
+        varInteger  : Result := qword(PInteger(vPointer)^);
+        varSingle   : Result := qword(Round(PSingle(vPointer)^));
+        varDouble   : Result := qword(Round(PDouble(vPointer)^));
+        varCurrency : Result := qword(Round(PCurrency(vPointer)^));
+        varDate     : Result := qword(Round(PDate(vPointer)^));
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varBoolean  : Result := SmallInt(PWordBool(vPointer)^);
         varVariant  : Result := VariantToQWord(PVarData(vPointer)^);
         varVariant  : Result := VariantToQWord(PVarData(vPointer)^);
         varByte     : Result := PByte(vPointer)^;
         varByte     : Result := PByte(vPointer)^;
         varWord     : Result := PWord(vPointer)^;
         varWord     : Result := PWord(vPointer)^;
         varLongWord : Result := PLongWord(vPointer)^;
         varLongWord : Result := PLongWord(vPointer)^;
-        varInt64    : Result := PInt64(vPointer)^;
+        varInt64    : Result := qword(PInt64(vPointer)^);
         varQword    : Result := PQWord(vPointer)^;
         varQword    : Result := PQWord(vPointer)^;
         varOleStr   : Result := WStrToQWord(PPointer(vPointer)^);
         varOleStr   : Result := WStrToQWord(PPointer(vPointer)^);
         varString   : Result := LStrToQWord(PPointer(vPointer)^);
         varString   : Result := LStrToQWord(PPointer(vPointer)^);