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

【已解决】判断程序是否安装 [复制链接]

上一主题 下一主题
离线wszjf
 

发帖
27
金钱
270
威望
27
只看楼主 倒序阅读 0 发表于: 2016-08-08
刚刚注册进入本坛,本来有好多问题的,通过搜索功能大部分都解决了,有一个问题没有解决,希望老师帮忙解决。
用inno制作插件安装的工具,本插件根据注册表位置和设定的组件任务,可以对应的安装到原程序的多个版本对应的文件夹中去。
以上问题都解决了,现在想加一个判断:根据注册表的位置判断程序的4个版本是否安装,如果有1个版本安装了,则继续执行下面的任务,如果1个版本也没安装,则出现原程序未安装的提示,现在只会判断1个,不会判断多个,望老师帮忙解决!


//用以下代码检测成功




// 检测是否已经安装原版
function InitializeSetup (): Boolean;
begin
Result := true;
if not RegValueExists(HKLM, 'SOFTWARE\Systems\Studio\5.0\Installer','Path') then
begin
MsgBox('检测到您的系统内没有安装原版程序,请先安装原版程序再运行此工具。', mbInformation, MB_OK);
Result := False;
end;
end;n

//其他版本注册表位置
KLM, 'SOFTWARE\Systems\Studio\6.0\Installer','Path'
KLM, 'SOFTWARE\Systems\Studio\7.0\Installer','Path'
KLM, 'SOFTWARE\Systems\Studio\8.0\Installer','Path'

希望实现的效果:
根据注册表的位置判断程序的4个版本是否安装,如果有1个版本安装了,则继续执行下面的任务,如果1个版本也没安装,则出现原程序未安装的提示,现在只会判断1个,不会判断多个,望老师帮忙解决!

离线wanfu

发帖
2728
金钱
12110
威望
1211
只看该作者 1 发表于: 2016-08-09
[code]
// 检测是否已经安装原版
function InitializeSetup (): Boolean;
var
i: integer;
begin
Result := False;
for i := 5 to 8 do
   begin
   if RegValueExists(HKLM, 'SOFTWARE\Systems\Studio\' + i + '.0\Installer','Path') then begin
        Result := True;
         break;
    end;
   end;
//检查返回值是否为True
begin
   if Result = False then begin
       MsgBox('检测到您的系统内没有安装原版程序,请先安装原版程序再运行此工具。', mbInformation, MB_OK);
   end;
end;
end;

把要检测的注册表值做成一个循环,如果检测到某个值存在即设置返回值为真并退出,否则继续检测下一个值,全部不存在时显示提示。
离线wszjf

发帖
27
金钱
270
威望
27
只看该作者 2 发表于: 2016-08-09
回 1楼(wanfu) 的帖子
wanfu:// 检测是否已经安装原版function InitializeSetup (): Boolean;vari: integer;....... (2016-08-09 11:09)


非常感谢wanfu版主的解答,但是好像还有问题:
\‘ + i + ’.0\好像获得不到正确的值,如果用\‘ + i + ’.0\无论什么情况就会弹出提示,无法进行下一步,改为\8.0\能顺利进行下一步安装,直接复制的版主的原代码

离线wszjf

发帖
27
金钱
270
威望
27
只看该作者 3 发表于: 2016-08-09
回 1楼(wanfu) 的帖子
wanfu:// 检测是否已经安装原版function InitializeSetup (): Boolean;vari: integer;....... (2016-08-09 11:09) 

对了,我是win7 64位系统,安装的程序是32位的
离线wanfu

发帖
2728
金钱
12110
威望
1211
只看该作者 4 发表于: 2016-08-09
对了,要把 + i + 中的 i 先转为字符串。将 i 改为:IntToStr(i) 试试看。
另, \' + i + ' 中的 ' 为半角单逗号,我上面的脚本这个逗号不对(已修改)。
离线wszjf

发帖
27
金钱
270
威望
27
只看该作者 5 发表于: 2016-08-09
回 4楼(wanfu) 的帖子
wanfu:对了,要把 + i + 中的 i 先转为字符串。将 i 改为:IntToStr(i) 试试看。另, \' + i + ' 中的 ' 为半角单逗号,我上面的脚本这个逗号不对(已修改)。 (2016-08-09 17:39)

问题已解决,非常感谢wanfu版主,还想再问一个问题,还是1 楼的问题,如果要判断的注册表值不是连续的,或者是字母等其他值时,假设判断5.0、x7.0、y9.0,有没有用or或and 列举 来实现的方法?这主要用在,有些程序新版本号,不按以前的规则编号时。还有就是如果以上值如果都不存在时弹出的对话框可不可以,点  是  能继续其他任务,点   否   退出呢?
离线wanfu

发帖
2728
金钱
12110
威望
1211
只看该作者 6 发表于: 2016-08-10
可以的,有二种方式:数组或多个 if...else 方式
1、数组方式
  1. [code]
  2. // 检测是否已经安装原版
  3. function InitializeSetup (): Boolean;
  4. var
  5. i: integer;
  6. RootKeys: array[0..3] of Integer;
  7. SubKeys: array[0..3] of string;
  8. ValueNames: array[0..3] of string;
  9. begin
  10. Result := False;
  11. RootKeys[0] := HKCR;
  12. RootKeys[1] := HKCU;
  13. RootKeys[2] := HKLM;
  14. RootKeys[3] := HKLM;
  15. SubKeys[0] := 'SubKey1';
  16. SubKeys[1] := 'SubKey2';
  17. SubKeys[2] := 'SubKey3';
  18. SubKeys[3] := 'SubKey4';
  19. ValueNames[0] := 'ValueName1';
  20. ValueNames[1] := 'ValueName2';
  21. ValueNames[2] := 'ValueName3';
  22. ValueNames[3] := 'ValueName4';
  23. for i := 0 to 3 do
  24.    begin
  25.    if RegValueExists(RootKeys[i], SubKeys[i],ValueNames[i]) then begin
  26.         Result := True;
  27.          break;
  28.     end;
  29.    end;
  30. //检查返回值是否为True
  31. begin
  32.    if Result = False then begin
  33.        MsgBox('检测到您的系统内没有安装原版程序,请先安装原版程序再运行此工具。', mbInformation, MB_OK);
  34.    end;
  35. end;
  36. end;

2、多个 if...else 方式
  1. [code]
  2. // 检测是否已经安装原版
  3. function InitializeSetup (): Boolean;
  4. begin
  5. Result := False;
  6. if RegValueExists(HKCR, 'SubKey1','ValueName1') then begin
  7.     Result := True;
  8. end else
  9. if RegValueExists(HKCU, 'SubKey2','ValueName2') then begin
  10.    Result := True;
  11. end else
  12. if RegValueExists(HKLM, 'SubKey3','ValueName3') then begin
  13.     Result := True;
  14. end else
  15. if RegValueExists(HKLM, 'SubKey4','ValueName4') then begin
  16.     Result := True;
  17. end;
  18. //检查返回值是否为True
  19. begin
  20.    if Result = False then begin
  21.        MsgBox('检测到您的系统内没有安装原版程序,请先安装原版程序再运行此工具。', mbInformation, MB_OK);
  22.    end;
  23. end;
  24. end;


离线wszjf

发帖
27
金钱
270
威望
27
只看该作者 7 发表于: 2016-08-10
回 6楼(wanfu) 的帖子
问题已解决,再次感谢wanfu版主,还想再问一个问题,如果以上值都不存在时,弹出的对话框可不可以:有两个选项,点“是”能继续其他任务(比方说安装原版程序),点“否”退出安装过程呢?
希望:点“是”时实际是跳过本检测过程,进行全部安装过程,我已解决了注册表值不存在时,不会安装对应版本插件的问题,所以点“是”就会实现只安装原版程序的目的。

begin
   if Result = False then begin
       MsgBox('检测到您的系统内没有安装原版程序,本工具包含原版程序,点“是”安装原版程序,点“否”退出安装过程。', mbInformation, MB_OK);
   end;
end;
end;

离线wanfu

发帖
2728
金钱
12110
威望
1211
只看该作者 8 发表于: 2016-08-10

  1. var
  2.   ResultCode: Integer;
  3.   //以上二句代码要合并到(移到)函数的开头
  4. begin
  5.   if Result = False then begin
  6.      //用是或否询问用户,默认为否
  7.      if MsgBox('检测到您的系统内没有安装原版程序,本工具包含原版程序,点“是”安装原版程序,点“否”退出安装过程。', mbInformation, MB_YESNO or MB_DEFBUTTON2) = IDYES then begin
  8.      // 运行记事本程序并等待它终止
  9.      if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW,ewWaitUntilTerminated, ResultCode) then
  10.           begin
  11.               Result := True;
  12.               // 如果需要处理完成,ResultCode 包含退出代码
  13.           end else begin
  14.               // 如果需要处理失败;ResultCode 包含错误代码
  15.               MsgBox(SysErrorMessage(ResultCode), mbError, mb_Ok);
  16.           end;
  17.       end;
  18.    end;
  19. end;


提示:
“检测到您的系统内没有安装原版程序,本工具包含原版程序,点“是”安装原版程序,点“否”退出安装过程。”这种在 [Code] 段中的字符串,最好在 [CustomMessages] 中定义,这样就可以支持多语言。

在脚本中添加如下内容:
1、多语言情况
[Languages]
Name: "enu"; MessagesFile: "compiler:English.isl"
Name: "chs"; MessagesFile: "compiler:Default.isl"  
; Inno Setup 汉化版将默认语言翻译成了简体中文,原版可能不一样。

[CustomMessages]
enu.NotOriginalAppMsg = Original program detects that your system is not installed. This tool contains the original program, click "Yes" to install the original program, "No" to exit the installation.
chs.NotOriginalAppMsg = 检测到您的系统内没有安装原版程序,本工具包含原版程序,点“是”安装原版程序,点“否”退出安装过程。

2、单语言情况
[CustomMessages]
NotOriginalAppMsg = 检测到您的系统内没有安装原版程序,本工具包含原版程序,点“是”安装原版程序,点“否”退出安装过程。

调用自定义消息:
MsgBox(CustomMessage('NotOriginalAppMsg'), mbInformation, MB_YESNO or MB_DEFBUTTON2)

离线wszjf

发帖
27
金钱
270
威望
27
只看该作者 9 发表于: 2016-08-10
回 8楼(wanfu) 的帖子
wanfu:var  ResultCode: Integer;    //以上二句代码要合并到(移到)函数的开头....... (2016-08-10 10:38) 

非常感谢版主耐心细致回答,今天在外边,晚上再试,再次感谢!!!在这里没有解决不了的问题!!!!