- 제품 이름: 델파이
- 제품 버전: 2006
- 제품 요소: 컴파일러
- 플랫폼/OS 버전: Win32
윈도우 2000에서 variant 타입 varInt64가 문제가 되는 이유는, 단지 윈도우 2000이 이 타입을 지원하지 않기 때문입니다.
이 문제를 확인하기 위해서는 다음과 같은 코드를 윈도우 2000에서 실행시켜보면 됩니다.
procedure TForm1.Button2Click(Sender: TObject);
var
v,v2: OleVariant;
i: Int64;
begin
I := 123456789012345;
v := i;
v2 := 'Y';
v := v2; // <- _VarCopy를 호출하는 중에 에러가 발생합니다. 이 함수는 OLEAUTO32.DLL의 VariantCopy 함수를 호출합니다.
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;
(true로 설정되면 OleVariant에서 varInt64를 지원하지 않는 윈도우 9x/2000 플랫폼에서의 호환성을 위해 Int64 값이 varDouble로 변환된다)
다음의 유닛은 윈도우 2000일 경우 위의 변수 값을 설정하여 에러를 피할 수 있게 해줍니다.
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.
이 유닛이 적용될 경우 유효 숫자를 잃게 된다는 점도 기억해두십시오.