Windows2000下で バリアントと Int64の値を使用する際に発生する問題について

Abstract: Windows2000下でバリアントと Int64の値を使用する際に発生する問題について説明します。

Product Name:        Delphi
Product Version:      2006, 2007, 2009
Product Component:    Compiler
Platform/OS Version:  Win32

Windows2000上でバリアントとバリアント型「verInt64」であるバリアントを使用するにあたり、問題となる理由として、Windows2000はこの型をサポートしていないところにあります。

Windows 2000上で以下のコードを実行することにより問題を確認できます。

procedure TForm1.Button2Click(Sender: TObject);
var
v,v2: OleVariant;
i: Int64;
begin
  I := 123456789012345; 
  v := i;
  v2 := 'Y';
  v := v2; // <- Error happens during a call to the _VarCopy which calls VariantCopy in OLEAUTO32.DLL
end;

RTLは、このような問題に対する回避方法を持っています。

Variants.pas ソースファイルから...

  // If TRUE Int64 values are converted to varDouble for compatibility with
  // Windows 9x/2000 platforms which don't support varInt64 in OleVariant.
  OleVariantInt64AsDouble: Boolean = False;

以下のユニットは、Windows2000上で上記の変数をセットするのに使用することができます。

unit VariantOSSetup;
interface
implementation
uses
  Sysutils, Variants;
function CheckWin32VersionBelow(AMajor: Integer; AMinor: Integer = 0): Boolean;
begin
  Result := (Win32MajorVersion < AMajor) or ((Win32MajorVersion = AMajor) and 
                                                   (Win32MinorVersion <= AMinor));
end;
initialization 
  OleVariantInt64AsDouble := CheckWin32VersionBelow(5);
end.

注意: 有効桁数を失う場合があります。