论坛风格切换切换到宽版
  • 8126阅读
  • 12回复

inno setup如何判断系统是否装了VC++2012以及一些相类似的程序 [复制链接]

上一主题 下一主题
离线王毛毛
 

发帖
4
金钱
40
威望
4
只看楼主 倒序阅读 0 发表于: 2015-09-07
inno setup如何判断系统是否装了VC++2012以及一些相类似的程序,就是根据注册表来判断但要在32位和64位注册表是不一样的,有没有方便的方法
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 1 发表于: 2015-09-07
在论坛一搜,这类应该很多吧?
示例1:
  1. [Setup]
  2. AppName=My Program
  3. AppVersion=1.5
  4. DefaultDirName={pf}\My Program
  5. DefaultGroupName=My Program
  6. UninstallDisplayIcon={app}\MyProg.exe
  7. Compression=lzma2
  8. SolidCompression=yes
  9. [Files]
  10. Source: "vcredist_x86.exe"; DestDir: "{app}"
  11. //静默安装vcredist_x86.exe
  12. [Run]
  13. Filename: {app}\vcredist_x86.exe; Parameters: /q; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ Runtime ..."; Check: NeedInstallVC9SP1
  14. [Code]
  15. var
  16. vc9SP1Missing: Boolean;
  17. function NeedInstallVC9SP1(): Boolean;
  18. begin
  19. Result := vc9SP1Missing;
  20. end;
  21. function InitializeSetup(): Boolean;
  22. var
  23. version: Cardinal;
  24. begin
  25. if RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9A25302D-30C0-39D9-BD6F-21E6EC160475}', 'Version', version) = false
  26. then
  27.    begin
  28.      vc9SP1Missing := true;
  29.    end;
  30. result := true;
  31. end;

示例二,老虎版主的示例:
  1. [Setup]
  2. AppName=My Program
  3. AppVersion=1.5
  4. DefaultDirName={pf}\My Program
  5. DisableProgramGroupPage=yes
  6. UninstallDisplayIcon={app}\MyProg.exe
  7. OutputDir=.
  8. [Files]
  9. Source: "isxdl.dll"; DestDir: {tmp}; Flags: dontcopy
  10. Source: "chinese.ini"; Flags: dontcopy
  11. [code]
  12. function isxdl_Download(hWnd: Integer; URL, Filename: PAnsiChar): Integer;
  13. external 'isxdl_Download@files:isxdl.dll stdcall';
  14. function isxdl_IsConnected: Integer;
  15. external 'isxdl_IsConnected@files:isxdl.dll stdcall';
  16. function isxdl_SetOption(Option, Value: PAnsiChar): Integer;
  17. external 'isxdl_SetOption@files:isxdl.dll stdcall';
  18. function GetNumber(var temp: String): Integer;
  19. var
  20.   part: String;
  21.   pos1: Integer;
  22. begin
  23.   if Length(temp) = 0 then
  24.     begin
  25.       Result := -1;
  26.       Exit;
  27.     end;
  28.   pos1 := Pos('.', temp);
  29.   if (pos1 = 0) then
  30.     begin
  31.       Result := StrToInt(temp);
  32.       temp := '';
  33.     end
  34.   else
  35.     begin
  36.       part := Copy(temp, 1, pos1 - 1);
  37.       temp := Copy(temp, pos1 + 1, Length(temp));
  38.       Result := StrToInt(part);
  39.     end;
  40. end;
  41. function CompareInner(var temp1, temp2: String): Integer;
  42. var
  43.   num1, num2: Integer;
  44. begin
  45.   num1 := GetNumber(temp1);
  46.   num2 := GetNumber(temp2);
  47.   if (num1 = -1) or (num2 = -1) then
  48.   begin
  49.     Result := 0;
  50.     Exit;
  51.   end;
  52.     if (num1 > num2) then
  53.       begin
  54.         Result := 1;
  55.       end
  56.     else
  57.       if (num1 < num2) then
  58.         begin
  59.           Result := -1;
  60.         end
  61.       else
  62.         begin
  63.           Result := CompareInner(temp1, temp2);
  64.         end;
  65. end;
  66. function CompareVersion(str1, str2: String): Integer;
  67. var
  68.   temp1, temp2: String;
  69. begin
  70.   temp1 := str1;
  71.   temp2 := str2;
  72.   Result := CompareInner(temp1, temp2);
  73. end;
  74. function vc2010_installed: Boolean;
  75. var
  76.   VersionNum: String;
  77. begin
  78.   result := false;
  79.   if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86', 'Version', VersionNum) then
  80.     begin
  81.       Delete(VersionNum, 1, 1);
  82.       if CompareVersion(VersionNum, '10.0.40219.1') >= 0 then       // 检查 VC 2010 版本号是否大于 10.0.40219.1
  83.         result := true;
  84.     end;
  85. end;
  86. function netframework4_installed: Boolean;
  87. var
  88.   iWert: Cardinal;
  89. begin
  90.   result := false;
  91.   if RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full', 'Install', iWert) then
  92.     if iWert = 1 then
  93.       result := true;
  94. end;
  95. procedure CurStepChanged(CurStep: TSetupStep);
  96. var
  97.   ErrorCode: Integer;
  98. begin
  99.   if CurStep = ssPostInstall then
  100.     begin
  101.     if not vc2010_installed then
  102.       begin
  103.       WizardForm.StatusLabel.Caption := '正在安装 Microsoft Visual C++ 2010 Redistributable,请稍候...';
  104.       ExtractTemporaryFile('vcredist_x86.exe');
  105.       Exec(ExpandConstant('{tmp}\vcredist_x86.exe'), '/passive', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode);
  106.       end;
  107.     if not netframework4_installed then
  108.       begin
  109.       WizardForm.StatusLabel.Caption := '正在检查 Microsoft .NET Framework 运行环境,请稍候...';
  110.       if MsgBox('警 告%n%n您的系统中尚未安装 Microsoft .NET Framework 4。%n安装程序可以自动下载并安装所需文件。%n您想要自动下载和安装 Microsoft .NET Framework 4 吗?', mbCriticalError, MB_YESNO or MB_DEFBUTTON2) = IDYES then
  111.         if isxdl_IsConnected = 1 then
  112.           begin
  113.           ExtractTemporaryFile('chinese.ini');
  114.           isxdl_SetOption('language', ExpandConstant('{tmp}\chinese.ini'));  // 语言文件
  115.           isxdl_SetOption('title', '你的安装程序');
  116.           isxdl_SetOption('label', '下载');
  117.           isxdl_SetOption('description', '下载 Microsoft .NET Framework');
  118.           if isxdl_Download(0, 'http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe', PAnsiChar(ExpandConstant('{tmp}\dotNetFx40_Full_x86_x64.exe'))) = 1 then
  119.             Exec(ExpandConstant('{tmp}\dotNetFx40_Full_x86_x64.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode);
  120.           end
  121.         else
  122.           MsgBox('您目前没有 Internet 连接,请您以后从微软网站下载。', mbInformation, MB_OK);
  123.        end;
  124.     end;
  125. end;

附件: 检测并自动安装VC运行库等.zip (61 K) 下载次数:6
另外,64 位系统下 32位安装模式会自动转到32位注册表视图下,应该不用区分!
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 2 发表于: 2015-09-07
实在不一样,笨方法,32位和64位都来一次检测不就行了
离线王毛毛

发帖
4
金钱
40
威望
4
只看该作者 3 发表于: 2015-09-07
回 2楼(546242502) 的帖子
546242502:实在不一样,笨方法,32位和64位都来一次检测不就行了[表情]  (2015-09-07 16:31) 

我就是不知道该怎么判断是32位还是64位
离线王毛毛

发帖
4
金钱
40
威望
4
只看该作者 4 发表于: 2015-09-07
回 3楼(王毛毛) 的帖子
王毛毛:我就是不知道该怎么判断是32位还是64位 (2015-09-07 17:11) 

HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\这是32位的地址

HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\这是64位地址
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 5 发表于: 2015-09-07
回 4楼(王毛毛) 的帖子
王毛毛:HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\这是32位的地址 HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\这是64位地址 (2015-09-07 17:16) 

这就是我说的第一种情况。64 位系统下 32位安装模式会自动转到32位注册表视图下,不用区分!

HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ 就行。

话说你自己没测试一下么,很多地方自己测试一下就知道了


SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ 就是 64位系统的32位注册表视图
离线王毛毛

发帖
4
金钱
40
威望
4
只看该作者 6 发表于: 2015-09-08
回 5楼(546242502) 的帖子
546242502:这就是我说的第一种情况。64 位系统下 32位安装模式会自动转到32位注册表视图下,不用区分!HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ 就行。....... (2015-09-07 19:10) 

写了一段 测试时一直在安装文件 找不出哪里有错 麻烦看一下
function IsDsfMissing(): Boolean;
var
version: Cardinal;
begin
if(not Iswin64) then
  begin
    Result := not RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{a55ac379-46b0-461a-95b1-fef5c08443f2}', 'Version', version);
  end;
if(Iswin64) then
  begin
    Result := not RegQueryDWordValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{a55ac379-46b0-461a-95b1-fef5c08443f2}', 'Version', version);
  end;
end;
                                                    
function InitializeSetup(): Boolean;
begin
if IsDsfMissing() then
   begin    
     ExtractTemporaryFile('vcredistx86.exe');
   end;
   Result := true;
end;
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 7 发表于: 2015-09-08
回 6楼(王毛毛) 的帖子
没测试,你要的结果应该是这样:
[Files]
Source: "vcredistx86.exe"; DestDir: "{tmp}"; Flags: dontcopy


[CODE]
function IsDsfMissing(): Boolean;
var
version: Cardinal;
begin
Result := not RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{a55ac379-46b0-461a-95b1-fef5c08443f2}', 'Version', version);
end;
                                                    
function InitializeSetup(): Boolean;
begin
if IsDsfMissing() then
   begin    
     ExtractTemporaryFile(ExpandConstant('vcredistx86.exe'));
     Exec(ExpandConstant('{tmp}\vcredistx86.exe'),  '/silent /verysilent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
   end;
   Result := true;
end;
离线solan

发帖
80
金钱
800
威望
80
只看该作者 8 发表于: 2015-10-31
如果要批量判断和安装vc运行库2005、2008、2010、2012、2013和2015等等那要怎么办?
离线solan

发帖
80
金钱
800
威望
80
只看该作者 9 发表于: 2015-10-31
如果按照上面说的代码写,那要写多少啊