델파이 작업중에 OS의 버전을 확인하려면 SysUtils에 있는 Win32MajorVersion, Win32MinorVersion, CheckWin32Version을 사용하면 됩니다. 하지만 이 변수를 사용하는 데 문제는 ServicePack까지 체크가 필요하다면?? 이걸로는 방법이 없죠.
진행하는 프로젝트에서 GetProcessId 를 사용하려고 했는데 친절하게도 이 함수는 Vista 또는 XP SP1이후에서 사용합니다. 하지만 운 없게도 아직 Windows 2000을 사용하는 PC가 있더군요. 결국은 Windows2000에도 호환되는 코드를 사용해야했고 OS 버전 뿐만 아니라 서비스 팩 버전까지 확인해야습니다. 결국은 jedi-apilib 프로젝트의 도움을 받아서 아래처럼 처리했군요.
사용은 간단하게... XP SP1 이상인지 체크한다면 CheckWin32Version(osXP, 1) 하면 되겠습니다.
type
TOSVersion = (
os2000,
osXP,
osVista
);
OSVERSIONINFOEXA = record
dwOSVersionInfoSize: DWORD;
dwMajorVersion: DWORD;
dwMinorVersion: DWORD;
dwBuildNumber: DWORD;
dwPlatformId: DWORD;
szCSDVersion: array [0..127] of CHAR; // Maintenance string for PSS usage
wServicePackMajor: WORD;
wServicePackMinor: WORD;
wSuiteMask: WORD;
wProductType: BYTE;
wReserved: BYTE;
end;
DWORDLONG = ULONGLONG;
const
VER_MAJORVERSION = $0000002;
VER_MINORVERSION = $0000001;
VER_SERVICEPACKMAJOR = $0000020;
VER_SERVICEPACKMINOR = $0000010;
VER_EQUAL = 1;
VER_GREATER = 2;
VER_GREATER_EQUAL = 3;
VER_LESS = 4;
VER_LESS_EQUAL = 5;
VER_AND = 6;
VER_OR = 7;
VER_CONDITION_MASK = 7;
VER_NUM_BITS_PER_CONDITION_MASK = 3;
function VerifyVersionInfoA(var lpVersionInformation: OSVERSIONINFOEXA;
dwTypeMask: DWORD; dwlConditionMask: DWORDLONG): BOOL; stdcall; external 'kernel32.dll';
function VerSetConditionMask(ConditionMask: ULONGLONG; TypeMask: DWORD;
Condition: BYTE): ULONGLONG; stdcall; external 'kernel32.dll';
procedure VER_SET_CONDITION(var Mask: DWORDLONG; TypeBitmask, ConditionMask: ULONG);
begin
Mask := VerSetConditionMask(Mask, TypeBitmask, ConditionMask);
end;
function CheckWin32Version(OS: TOSVersion;
ServicePackVerson: Integer): Boolean;
var
osMajor, osMinor: DWORD;
osvi: OSVERSIONINFOEXA;
ConditionalMask: ULONGLONG;
procedure SetOSVer(Major, Minor: DWORD);
begin
osMajor := Major;
osMinor := Minor;
end;
begin
// OS별 버전 번호는 다음 도움말 참조
// ms-help://borland.bds5/sysinfo/base/osversioninfo_str.htm
case OS of
os2000: SetOSVer(5, 0);
osXP: SetOSVer(5, 1);
osVista: SetOSVer(6, 0);
else raise Exception.CreateFmt('CheckWin32Version(%s) not supported',
[GetEnumName(TypeInfo(TOSVersion), Integer(OS))]);
end;
FillChar(osvi, SizeOf(osvi), 0);
osvi.dwOSVersionInfoSize := SizeOf(osvi);
osvi.dwMajorVersion := osMajor;
osvi.dwMinorVersion := osMinor;
osvi.wServicePackMajor := ServicePackVerson;
ConditionalMask := 0;
VER_SET_CONDITION(ConditionalMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
VER_SET_CONDITION(ConditionalMask, VER_MINORVERSION, VER_GREATER_EQUAL);
VER_SET_CONDITION(ConditionalMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
Result := VerifyVersionInfoA(osvi,
VER_MAJORVERSION or VER_MINORVERSION or VER_SERVICEPACKMAJOR,
ConditionalMask);
end;
|