C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[15390] 서비스팩 버전 확인하기..
DrK [whitekid] 4723 읽음    2008-11-25 09:50
델파이 작업중에 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;

+ -

관련 글 리스트
15390 서비스팩 버전 확인하기.. DrK 4723 2008/11/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.