找回密码
 加入
搜索
查看: 5361|回复: 12

[AU3基础] 如何判断程序安装成功?

  [复制链接]
发表于 2010-12-6 10:57:20 | 显示全部楼层 |阅读模式
现已经实现自动安装程序成功,但是我想知道程序是否安装成功,应该怎么去检测呢,注册表?开始菜单?控制面板?因为涉及到多个语言系统,需要考虑语言问题,有没有可以判断很准确的办法呢?
发表于 2010-12-6 11:17:03 | 显示全部楼层
晕,这个不懂了,检测下安装目录是否存在不可以吗?
 楼主| 发表于 2010-12-6 13:14:11 | 显示全部楼层
回复 2# mo_shaojie


不知道安装目录存在是不是就一定安装成功,想要去开始菜单去查看来判断,但是怎么去查看开始菜单呢?又涉及到多语言系统
发表于 2010-12-6 13:17:13 | 显示全部楼层
程序安装成功?安装程序运行完毕还有安装不成功的吗?那么什么叫做安装不成功呢?
我的想法是:运行安装的程序,某特定窗口出现,安装即成功,关闭程序,验证结束!
 楼主| 发表于 2010-12-6 18:03:19 | 显示全部楼层
遇到过这种情况,安装重启回来,程序的某一部分安装不成功,比如驱动未安装上,应用程序不存在。现在采用的办法是利用@ProgramsCommonDir进入Program文件夹,然后查找安装的目录,登陆应用程序,这样可以检测应用程序是否成功。至于驱动是否成功,我想知道的是,注册表里面有的话,是不是就一定表明驱动安装成功了呢?还是要检测Device Manager里面的信息,或者控制面部的信息,还是三者都要呢?
发表于 2010-12-6 18:32:20 | 显示全部楼层
驱动可以判断安装后驱动版本和你提供的版本是不是相符,注册表里面有
发表于 2010-12-6 19:04:28 | 显示全部楼层
先不说安装问题,就说说你那多语言问题,AU3的宏不就可以解决?比如@ProgramsCommonDir
 楼主| 发表于 2010-12-7 09:53:21 | 显示全部楼层
回复 7# tryhi


    是的,现在多语言的问题是采用宏来解决的
 楼主| 发表于 2010-12-7 09:54:02 | 显示全部楼层
回复 6# yhxhappy


    那是不是只检查注册表就可以了呢?
发表于 2010-12-10 15:37:04 | 显示全部楼层
遇到过这种情况,安装重启回来,程序的某一部分安装不成功,比如驱动未安装上,应用程序不存在。现在采用的 ...
ransally 发表于 2010-12-6 18:03

这种情况应该不太好检测吧?直观的方法就是安装完了运行一次,如果是批量安装的话,这有点行不通就是了。
发表于 2010-12-10 15:44:47 | 显示全部楼层
软件的问题我就不讨论了,至于驱动安装完成与否,可以通过判断注册表里面的版本与安装的版本是否一致,一致则表示安装成功。虽然不能100%正确,但还是比较稳妥的
下面的源码是演示如何取设备的驱动版本,楼主自己研究吧
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiTreeView.au3>
#include <SetupApi.au3>

Local $Hardware[1][4]
Local $Class[1][2]

$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[0][0]
                If $aClass[$i][0] = "{8ECC055D-047F-11D1-A537-0000F8753ED1}" Then ContinueLoop                ;非即插即用设备 排除
                ;If $Class[$i][0] = "{4d36e96b-e325-11ce-bfc1-08002be10318}" Then ContinueLoop                ;PS2键盘  排除 
                ;If $Class[$i][0] = "{4d36e96f-e325-11ce-bfc1-08002be10318}" Then ContinueLoop                ;PS2鼠标  排除
                ;If $Class[$i][0] = "{745A17A0-74D3-11D0-B6FE-00A0C90F57DA}" Then ContinueLoop                ;USB输入设备,含USB鼠标  排除
                ;If $Class[$i][0] = "{36FC9E60-C465-11CF-8056-444553540000}" Then ContinueLoop                ;通用串行总线控制器  排除
                ;If $Class[$i][0] = "{4D36E96E-E325-11CE-BFC1-08002BE10318}" Then ContinueLoop                ;监示器  排除
                        

                $Device = _CM_Enum_Device_Info($aClass[$i][0])                                                                                ;根据 Class 来枚举子项设备
                If $Device[0][0] <> 0 Then                                                                                                                         ;如果该 Class 下的子设备为 0 则跳过
                        For $a = 1 To $Device[0][0]
                                $iStatus = _CM_Get_DevNode_Status($Device[$a][2])                                                        ;根据设备号来判断设备是否在 设备管理器 内显示出来 $DN_NO_SHOW_IN_DM
                                If bitAND($iStatus, $DN_NO_SHOW_IN_DM) Then ContinueLoop
                                
                                $ID = _CM_Get_DevNode_Registry_Property($Device[$a][2], 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[2]
                                EndIf

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

                                If _ArraySearch($Class, $aClass[$i][1]) = -1 Then
                                        ReDim $Class[UBound($Class)+1][2]                                                        ;将本项设备的 Class 写进 $Class数组
                                        $Class[UBound($Class)-1][0] = $aClass[$i][1]
                                        $Class[0][0] = UBound($Class)-1
                                EndIf                                
                        Next
                EndIf
        Next
        
        _ArraySort($Class)                ;排序类数组
        _ArraySort($Hardware)        ;排序硬件数组
        
        $hItem = GUICtrlCreateTreeViewItem(@ComputerName, $Tree)                                                        ;计算机名添加进 TREE控件
        For $i = 1 To $Class[0][0]
                $hItem2 = GUICtrlCreateTreeViewItem($Class[$i][0], $hItem)                                                ;大类
                For $a = 1 To $Hardware[0][0]
                        If $Hardware[$a][1] = $Class[$i][0] Then
                                $hItem3 = GUICtrlCreateTreeViewItem($Hardware[$a][0], $hItem2)                        ;硬件添加进 TREE内的大类,如显卡设备属于 显示适配器 类
                                GUICtrlCreateTreeViewItem("硬件ID:" & $Hardware[$a][3], $hItem3)
                                GUICtrlCreateTreeViewItem("驱动版本:" & $Hardware[$a][2], $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
 楼主| 发表于 2010-12-13 11:40:17 | 显示全部楼层
回复 11# yhxhappy


    谢谢Happy
发表于 2010-12-13 11:48:41 | 显示全部楼层
If MsgBox(36,"请问","是否安装成功?")=6 Then msgbox(0,"","执行完毕")
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-21 16:44 , Processed in 0.083726 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表