论坛风格切换切换到宽版
  • 4265阅读
  • 8回复

老虎版主教我,判断WIN7系统安装补丁。 [复制链接]

上一主题 下一主题
离线qqjszl
 

发帖
126
金钱
1210
威望
121
只看楼主 正序阅读 0 发表于: 2015-04-17
手头上有一个windows6.1-KB976932-X64的补丁。想判断当用户系统是WIN7而不是WIN7 SP1的时候就安装。
我没有系统的学习过IS,只会把现成的一些脚本移来移去。下面根据好几个脚本弄的,都无法编译,就算编译成功也无法实现我的想法。


[Files]
Source: "D:\windows6.1-KB976932-X64.exe"; DestDir: "{tmp}"; Check: NeedInstallWindows7SP1

[Run]
Filename: "{tmp}\windows6.1-KB976932-X64.exe"; Parameters: /q; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Windows7 SP1"; Check: NeedInstallWindows7SP1

[Code]
var Windows7SP1Missing: Boolean;


function NeedInstallWindows7SP1(): Boolean;
begin
Result := Windows7SP1Missing;
end;


var Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);
  if Version.NTPlatform and
     (Version.Major = 6) or  IsWin64 Then
         Windows7SP1Missing := true;
  end;
  result := true;
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 8 发表于: 2015-04-21
function InitializeSetup: Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);

  if Version.NTPlatform and
     (Version.Major = 6) and
     (Version.Minor >= 2) Then
  begin
    SuppressibleMsgBox('目前暂不支持Windows 8系统。',
      mbCriticalError, MB_OK, MB_OK);
    Result := False;
    Exit;
  end;

  Result := True;
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 7 发表于: 2015-04-21
[code]
function InitializeSetup: Boolean;
var
  Version: TWindowsVersion;
  Win7SP1, Win8: boolean;
begin
  GetWindowsVersionEx(Version);
  Win7SP1 := Version.NTPlatform and (Version.Major = 6) and (Version.Minor = 1) and (Version.ServicePackMajor = 1);
  Win8 := Version.NTPlatform and (Version.Major = 6) and (Version.Minor >= 2);
  if not (IsWin64 and (Win7SP1 or Win8)) Then
  begin
    SuppressibleMsgBox('只能在Win7 SP1/Win8 的64位操作系统下安装并运行。',
      mbCriticalError, MB_OK, MB_OK);
    Result := False;
    Exit;
  end;

  Result := True;
end;

离线qqjszl

发帖
126
金钱
1210
威望
121
只看该作者 6 发表于: 2015-04-20

虎大:没有过多的系统测试代码,烦请你帮我看看有无错误的地方?
function InitializeSetup: Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);
  if Version.NTPlatform and
     (Version.Major < 6)
     (Version.Minor < 1) or not IsWin64 Then
  begin
    SuppressibleMsgBox('只能在Win7 SP1/Win8.1的64位操作系统下安装并运行。',
      mbCriticalError, MB_OK, MB_OK);
    Result := False;
    Exit;
  end;

  Result := True;
end;

function InitializeSetup: Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);

  if Version.NTPlatform and
     (Version.Major = 6) and
     (Version.Minor = 2) Then
  begin
    SuppressibleMsgBox('目前暂不支持Windows 8系统。',
      mbCriticalError, MB_OK, MB_OK);
    Result := False;
    Exit;
  end;

  Result := True;
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 5 发表于: 2015-04-18
楼主可以查看 Inno Setup 帮助文件中关于函数 GetWindowsVersionEx 的用法。

Pascal 脚本: GetWindowsVersionEx
语法:
procedure GetWindowsVersionEx(var Version: TWindowsVersion);

描述:
返回记录中有关 Windows 版本的扩展信息。

TWindowsVersion 定义为:

TWindowsVersion = record
   Major: Cardinal;             // 主版本号
   Minor: Cardinal;             // 副版本号
   Build: Cardinal;             // 构建号
   ServicePackMajor: Cardinal;  // 服务包主版本号
   ServicePackMinor: Cardinal;  // 服务包副版本号
   NTPlatform: Boolean;         // 如果是基于 NT 平台则为 True
   ProductType: Byte;           // 产品类型 (看下面)
   SuiteMask: Word;             // 安装的产品组件 (看下面)
end;

ProductType 对象可以是下列值中的一个:

  VER_NT_WORKSTATION
  VER_NT_DOMAIN_CONTROLLER
  VER_NT_SERVER

如果产品类型不能确定 (不一定可用),它也可以是零。VER_NT_WORKSTATION 表示非服务器版本的 Windows (例如工作站、专业版或家庭版)。

SuiteMask 对象可以是下列值的组合:

  VER_SUITE_BACKOFFICE
  VER_SUITE_BLADE
  VER_SUITE_DATACENTER
  VER_SUITE_ENTERPRISE
  VER_SUITE_EMBEDDEDNT
  VER_SUITE_PERSONAL
  VER_SUITE_SINGLEUSERTS
  VER_SUITE_SMALLBUSINESS
  VER_SUITE_SMALLBUSINESS_RESTRICTED
  VER_SUITE_TERMINAL

VER_SUITE_PERSONAL 设置在比如家庭版的 Windows XP,VER_SUITE_BLADE 设置在网络版的 Windows Server 2003。

示例:
下面的例子告诉你可以怎样在某些版本的 Windows 中不接受安装,并在多个操作系统版梧检查服务包等级。(这些内容都不可能用 [Setup] 段 MinVersion 指令。)

function InitializeSetup: Boolean;
var
  Version: TWindowsVersion;
  S: String;
begin
  GetWindowsVersionEx(Version);

  // 不接受在家庭版的 Windows 中安装
  if Version.SuiteMask and VER_SUITE_PERSONAL <> 0 then
  begin
    SuppressibleMsgBox('这个程序不能安装于家庭版的 Windows。',
      mbCriticalError, MB_OK, MB_OK);
    Result := False;
    Exit;
  end;

  // 不接受在域控制器中安装
  if Version.ProductType = VER_NT_DOMAIN_CONTROLLER then
  begin
    SuppressibleMsgBox('这个程序不能安装于域控制器。',
      mbCriticalError, MB_OK, MB_OK);
    Result := False;
    Exit;
  end;

  // 在 Windows 2000,检查 SP4
  if Version.NTPlatform and
     (Version.Major = 5) and
     (Version.Minor = 0) and
     (Version.ServicePackMajor < 4) then
  begin
    SuppressibleMsgBox('在 Windows 2000 运行时,必须安装 Service Pack 4。',
      mbCriticalError, MB_OK, MB_OK);
    Result := False;
    Exit;
  end;

  // 在 Windows XP 中,检查 SP2
  if Version.NTPlatform and
     (Version.Major = 5) and
     (Version.Minor = 1) and
     (Version.ServicePackMajor < 2) then
  begin
    SuppressibleMsgBox('在 Windows XP 运行时,必须安装 Service Pack 2。',
      mbCriticalError, MB_OK, MB_OK);
    Result := False;
    Exit;
  end;

  Result := True;
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 4 发表于: 2015-04-18
觉得 1 楼的代码还不大严谨,比如,如果系统是 Vista 的话,或者是 Win 7 并且 SP1 已经安装的话,按照1楼的代码则也会安装补丁,而这不是楼主的初衷。我理解楼主的初衷是:假如系统是 Win7,但是却没有 SP1 的情况下就安装指定的补丁。
以下代码供参考:

[Files]
Source: "D:\windows6.1-KB976932-X64.exe"; DestDir: "{tmp}"; Check: NeedInstallWindows7SP1

[Run]
Filename: "{tmp}\windows6.1-KB976932-X64.exe"; Parameters: "/q"; WorkingDir: "{tmp}"; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Windows7 SP1"; Check: NeedInstallWindows7SP1

[Code]
var Windows7SP1Missing: Boolean;

function NeedInstallWindows7SP1(): Boolean;
var Version: TWindowsVersion;
begin
  Windows7SP1Missing := false;
  GetWindowsVersionEx(Version);
  if Version.NTPlatform and
    (Version.Major = 6) and
    (Version.Minor = 1) and
    (Version.ServicePackMajor < 1) then
         Windows7SP1Missing := true;
  result := Windows7SP1Missing;
end;

离线qqjszl

发帖
126
金钱
1210
威望
121
只看该作者 3 发表于: 2015-04-17
谢谢 我试试啊
离线spser

发帖
30
金钱
300
威望
30
只看该作者 2 发表于: 2015-04-17
Check: NeedInstallWindows7SP1

换成

Check: IS_Windows7SP1
离线spser

发帖
30
金钱
300
威望
30
只看该作者 1 发表于: 2015-04-17
[Code]
var Windows7SP1Missing: Boolean;

function IS_Windows7SP1(): Boolean;
var Version: TWindowsVersion;
begin
  Windows7SP1Missing := false;
  GetWindowsVersionEx(Version);
  if Version.NTPlatform and
     (Version.Major = 6) or  IsWin64 Then begin
         Windows7SP1Missing := true;
  end;
  result := Windows7SP1Missing;
end;

换成这样.

if IS_Windows7SP1() then begin
   // 是win7 sp1
end;