ransally 发表于 2010-12-6 10:57:20

如何判断程序安装成功?

现已经实现自动安装程序成功,但是我想知道程序是否安装成功,应该怎么去检测呢,注册表?开始菜单?控制面板?因为涉及到多个语言系统,需要考虑语言问题,有没有可以判断很准确的办法呢?

mo_shaojie 发表于 2010-12-6 11:17:03

晕,这个不懂了,检测下安装目录是否存在不可以吗?

ransally 发表于 2010-12-6 13:14:11

回复 2# mo_shaojie


不知道安装目录存在是不是就一定安装成功,想要去开始菜单去查看来判断,但是怎么去查看开始菜单呢?又涉及到多语言系统

飘云 发表于 2010-12-6 13:17:13

程序安装成功?安装程序运行完毕还有安装不成功的吗?那么什么叫做安装不成功呢?
我的想法是:运行安装的程序,某特定窗口出现,安装即成功,关闭程序,验证结束!

ransally 发表于 2010-12-6 18:03:19

遇到过这种情况,安装重启回来,程序的某一部分安装不成功,比如驱动未安装上,应用程序不存在。现在采用的办法是利用@ProgramsCommonDir进入Program文件夹,然后查找安装的目录,登陆应用程序,这样可以检测应用程序是否成功。至于驱动是否成功,我想知道的是,注册表里面有的话,是不是就一定表明驱动安装成功了呢?还是要检测Device Manager里面的信息,或者控制面部的信息,还是三者都要呢?

yhxhappy 发表于 2010-12-6 18:32:20

驱动可以判断安装后驱动版本和你提供的版本是不是相符,注册表里面有

tryhi 发表于 2010-12-6 19:04:28

先不说安装问题,就说说你那多语言问题,AU3的宏不就可以解决?比如@ProgramsCommonDir

ransally 发表于 2010-12-7 09:53:21

回复 7# tryhi


    是的,现在多语言的问题是采用宏来解决的

ransally 发表于 2010-12-7 09:54:02

回复 6# yhxhappy


    那是不是只检查注册表就可以了呢?

ahphsautoit 发表于 2010-12-10 15:37:04

遇到过这种情况,安装重启回来,程序的某一部分安装不成功,比如驱动未安装上,应用程序不存在。现在采用的 ...
ransally 发表于 2010-12-6 18:03 http://www.autoitx.com/images/common/back.gif
这种情况应该不太好检测吧?直观的方法就是安装完了运行一次,如果是批量安装的话,这有点行不通就是了。

yhxhappy 发表于 2010-12-10 15:44:47

软件的问题我就不讨论了,至于驱动安装完成与否,可以通过判断注册表里面的版本与安装的版本是否一致,一致则表示安装成功。虽然不能100%正确,但还是比较稳妥的
下面的源码是演示如何取设备的驱动版本,楼主自己研究吧#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiTreeView.au3>
#include <SetupApi.au3>

Local $Hardware
Local $Class

$FORM = GUICreate("本机硬件信息", 800, 700)
$Tree = GUICtrlCreateTreeView(0, 0, 800, 700)

_HardwareScan()

GUISetState(@SW_SHOW) ; 显示窗口

;运行窗口直到用户关闭
While 1
        If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
WEnd
       
Func _HardwareScan()                                                                        ;扫描本机硬件信息并将信息添加至 TREE 控件
        $aClass = _CM_Enumerate_Classes()
        For $i = 1 To $aClass
                If $aClass[$i] = "{8ECC055D-047F-11D1-A537-0000F8753ED1}" Then ContinueLoop                ;非即插即用设备 排除
                ;If $Class[$i] = "{4d36e96b-e325-11ce-bfc1-08002be10318}" Then ContinueLoop                ;PS2键盘排除
                ;If $Class[$i] = "{4d36e96f-e325-11ce-bfc1-08002be10318}" Then ContinueLoop                ;PS2鼠标排除
                ;If $Class[$i] = "{745A17A0-74D3-11D0-B6FE-00A0C90F57DA}" Then ContinueLoop                ;USB输入设备,含USB鼠标排除
                ;If $Class[$i] = "{36FC9E60-C465-11CF-8056-444553540000}" Then ContinueLoop                ;通用串行总线控制器排除
                ;If $Class[$i] = "{4D36E96E-E325-11CE-BFC1-08002BE10318}" Then ContinueLoop                ;监示器排除
                       

                $Device = _CM_Enum_Device_Info($aClass[$i])                                                                                ;根据 Class 来枚举子项设备
                If $Device <> 0 Then                                                                                                                         ;如果该 Class 下的子设备为 0 则跳过
                        For $a = 1 To $Device
                                $iStatus = _CM_Get_DevNode_Status($Device[$a])                                                        ;根据设备号来判断设备是否在 设备管理器 内显示出来 $DN_NO_SHOW_IN_DM
                                If bitAND($iStatus, $DN_NO_SHOW_IN_DM) Then ContinueLoop
                               
                                $ID = _CM_Get_DevNode_Registry_Property($Device[$a], 2)                                        ;根据设备中断号取硬件ID
                                $xx = StringInStr($ID, "\" )                                                                                                ;在硬件ID里面查找 \ 这个符号
                                If $xx = 0 Then                                                                                                                                ;如果没有打到,则这个ID就当做硬件ID来使用
                                        $HardwareID = $ID
                                Else
                                        $IDarray = StringSplit($ID, StringMid($ID, 1, $xx), 1)                                        ;使用特定字符将ID字符串分割,例如PCI\,IDE\,
                                        $HardwareID = $IDarray
                                EndIf

                                ReDim $Hardware
                                $Hardware = $aClass[$i]                                                        ;将设备所属的 Class 写进 $Hardware_ID
                                $Hardware = $Device[$a]                                                        ;将设备名称 写进数组
                                $Hardware = Get_Driver_Version($Device[$a])                ;根据设备中断号取驱动版本 那个数字是不是中断号我也不确定,自己这么理解的
                                $Hardware = $HardwareID
                                $Hardware = UBound($Hardware)-1

                                If _ArraySearch($Class, $aClass[$i]) = -1 Then
                                        ReDim $Class                                                      ;将本项设备的 Class 写进 $Class数组
                                        $Class = $aClass[$i]
                                        $Class = UBound($Class)-1
                                EndIf                               
                        Next
                EndIf
        Next
       
        _ArraySort($Class)                ;排序类数组
        _ArraySort($Hardware)        ;排序硬件数组
       
        $hItem = GUICtrlCreateTreeViewItem(@ComputerName, $Tree)                                                        ;计算机名添加进 TREE控件
        For $i = 1 To $Class
                $hItem2 = GUICtrlCreateTreeViewItem($Class[$i], $hItem)                                                ;大类
                For $a = 1 To $Hardware
                        If $Hardware[$a] = $Class[$i] Then
                                $hItem3 = GUICtrlCreateTreeViewItem($Hardware[$a], $hItem2)                        ;硬件添加进 TREE内的大类,如显卡设备属于 显示适配器 类
                                GUICtrlCreateTreeViewItem("硬件ID:" & $Hardware[$a], $hItem3)
                                GUICtrlCreateTreeViewItem("驱动版本:" & $Hardware[$a], $hItem3)
                        EndIf
                Next
        Next
        GUICtrlSetState($hItem, $GUI_EXPAND)        ;展开 TREE 控件 根目录       
       
EndFunc
       
Func Get_Driver_Version($hDevInst)                                                ;取得驱动的版本,根据中断号       
        $ClassGUID = _CM_Get_DevNode_Registry_Property($hDevInst, 10)
        If $ClassGUID = "" Then Return "Unknown"                                        ;如果范例ID为空,则返回0并退出       
        If @OSArch = "X86" Then
                $Reg = "HKLM\SYSTEM\ControlSet001\Control\Class\"
        Else
                $Reg = "HKLM64\SYSTEM\ControlSet001\Control\Class\"
        EndIf
       
        $Version = RegRead($Reg & $ClassGUID, "DriverVersion")
        If $Version = "" Then                                                                                ;如果使用逗号无法分割,则说明读取到的内容不符,返回0
                Return "Unknown"
        Else
                Return $Version
        EndIf
EndFunc

ransally 发表于 2010-12-13 11:40:17

回复 11# yhxhappy


    谢谢Happy

蜘蛛抱蛋 发表于 2010-12-13 11:48:41

If MsgBox(36,"请问","是否安装成功?")=6 Then msgbox(0,"","执行完毕")
页: [1]
查看完整版本: 如何判断程序安装成功?