Cardinal 到 OleVariant 的错误转换。 UInt64 没问题
Posted
技术标签:
【中文标题】Cardinal 到 OleVariant 的错误转换。 UInt64 没问题【英文标题】:Erroneous conversion of Cardinal to OleVariant. UInt64 is ok 【发布时间】:2019-05-13 09:32:11 【问题描述】:program UInt32ToVariant;
uses
Vcl.Dialogs, System.SysUtils, System.Variants;
var
ui32Val: Cardinal;
si64Val: Int64;
ui64Val: UInt64;
v1: Variant;
v2: OleVariant;
sb: TStringBuilder;
begin
sb := TStringBuilder.Create();
try
ui32Val := 4234687430;
si64Val := Int64.MaxValue;
ui64Val := UInt64.MaxValue;
v1 := ui32Val;
v2 := ui32Val;
sb.AppendLine('Unsigned 32 bit integer:'#9 + Cardinal.ToString(ui32Val));
sb.AppendLine(#9'to Variant:'#9 + VarToStr(v1));
sb.AppendLine(#9'to OleVariant:'#9 + VarToStr(v2));
sb.AppendLine();
v1 := si64Val;
v2 := si64Val;
sb.AppendLine('Signed 64 bit integer:'#9 + Int64.ToString(si64Val));
sb.AppendLine(#9'to Variant:'#9 + VarToStr(v1));
sb.AppendLine(#9'to OleVariant:'#9 + VarToStr(v2));
sb.AppendLine();
v1 := ui64Val;
v2 := ui64Val;
sb.AppendLine('Unsigned 64 bit integer:'#9 + UInt64.ToString(ui64Val));
sb.AppendLine(#9'to Variant:'#9 + VarToStr(v1));
sb.AppendLine(#9'to OleVariant:'#9 + VarToStr(v2));
ShowMessage(sb.ToString());
finally
sb.Free();
end;
end.
结果是:
Unsigned 32 bit integer: 4234687430
to Variant: 4234687430
to OleVariant: -60279866 (Wrong!)
Signed 64 bit integer: 9223372036854775807
to Variant: 9223372036854775807
to OleVariant: 9223372036854775807
Unsigned 64 bit integer: 18446744073709551615
to Variant: 18446744073709551615
to OleVariant: 18446744073709551615 (Correct again!)
这真的是 Delphi 中的错误还是我做错了什么?
我可以假设 OleVariant 根本不支持无符号整数,但支持无符号 64 位整数,不支持 32 位。
【问题讨论】:
见quality.embarcadero.com/browse/RSP-18363 @Paul 您使用您的 EDN 凭据登录。如果您是专业的 Delphi 开发人员并且您没有 EDN 帐户,那么您应该有,所以go make one。 【参考方案1】:这是一个 Delphi 错误。
被举报为RSP-18363 Incorrect Conversion Cardinal to OleVariant
错误描述:
Cardinal 到 OleVariant 的直接转换不正确。 结果不同于从 Cardinal 到 Variant 到 OleVariant 的转换
【讨论】:
以上是关于Cardinal 到 OleVariant 的错误转换。 UInt64 没问题的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地将 OleVariant 数组复制到我自己的结构中?
Delphi XE4 E2010 不兼容的类型:“Cardinal”和“Pointer”
TMemoryStreamString与OleVariant互转
delphi中调用一函数function(Index :OleVariant),其中Index :OleVariant应该填写啥,OleVariant是啥