[已解决]如何通过INF文件安装驱动?
本帖最后由 yhxhappy 于 2010-12-10 15:38 编辑我想做一个自动安装RAID卡驱动的小程序,通常RAID卡的驱动都是INF形式的,使用了论坛上搜索到的如下方法安装失败,执行后没有任何反应,刷新设备管理器还是未安装驱动状态。但是在设备管理器里面,点击硬件手动更新驱动,然后指定路径到INF文件却是可以安装上的,现请教各位有没有别的方法能安装上的,或者是我的操作方法有问题。
Run("rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\xxx.inf")
或者:Run(@ComSpec & " /c " & 'rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\xxx.inf', "", @SW_HIDE)
另外,以前发帖的时候,P版提到过如下内容,第三种方式不适用,对于第一及第二种安装方式,P版能不能讲解一下呢?
SetupAPI.au3 提供3种驱动更新方式:
1、_CM_Install_DevInst_Ex,与设备管理器安装驱动的方式相同,可以指定光盘安装,也可以手动选择。
2、_CM_Install_Device_Driver,除了兼容第一种方式外,还可以指定多种更新标识,比如 静默安装。
3、_CM_Update_PnP_Device,指定ini文件,ini中定义安装参数。你所说的应该适于用这种方式安装。
_CM_Update_PnP_Device原型:
_CM_Update_PnP_Device($sDeviceID, $sInfPath, $iFlags, $hWnd = 0)
$sDeviceID - 要更新驱动的设备的硬件ID。
$sInfPath - INF路径。
$iFlags - 安装标识,一般指定为0即可。更多选项请参考http://msdn.microsoft.com/en-us/library/ff553534(VS.85).aspx
$hWnd - 父窗口句柄,可以指定为0。
硬件ID不同于设备范例ID,要获取一个设备的硬件ID,调用_CM_Get_DevNode_Registry_Property,传递CM_DRP_HARDWAREID属性值。
_CM_Update_PnP_Device,只能更新即插即用设备,对于非即插即用设备,用上面2种方法。
帖子放太久了,现在关闭。解决方法在10楼 rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 xxx.inf 回复 2# lixiaolong
谢谢指点,我试了试,确实有反应了,但提示“安装失败” 不知为何? 回复 3# yhxhappy
路径有问题.
试试这个,指定INF文件的完整路径
Run(@ComSpec & ' /c rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 ' & @DesktopDir & '\xxx.inf', "", @SW_HIDE)
文件名有空格也没关系.
Run(@ComSpec & ' /c rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 ' & @DesktopDir & '\x xx.inf', "", @SW_HIDE) 后来我也发现了是路径不对才会提示 安装错误
我也用了楼上的方法加上完整路径,还是没有任何反应,代码运行耗时零点几秒。
同样我也试了以下几种方法,还是没有效果。
ShellExecuteWait("Rundll32.eXe","SetupAPI,InstallHinfSection DefaultInstall 132 .\xxx.Inf")
Run("rundll32 setupapi,InstallHinfSection DefaultInstall 128 .\xxx.inf")
现在写的程序卡在这一步上了。也不知道如果安装成功的话会是什么一个过程,会有提示吗?安装进程会在调用后就退出还是安装成功后才退出?
希望知道的朋友指点一下! 回复 5# yhxhappy
如果安装成功的话没有什么提示,只是桌面闪一下.
在桌面建立一个INF文件,内容是以下 (文件右键添加‘To RAR’ (扩展名改成rar)
)
signature="$Windows NT$"
Provider=kajaa@eastday.com, 2002
; DelReg=rar_DelReg
AddReg=rar_AddReg
hkcr,"*\shell\To RAR\command",,,"cmd /c ren ""%%1"" ""*.rar"""
然后实行以下代码
Run(@ComSpec & ' /c rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 ' & @DesktopDir & '\xxx.inf', "", @SW_HIDE)
如果成功,桌面闪一下.
然后在文件上点击右键看看有没有“To RAR” ? 回复 6# lixiaolong
感谢热心的 lixiaolong,我试了成功。为什么我用来装驱动就不行呢,难道驱动的INF文件有问题?可为什么我通过设备管理器来添加驱动就可以安装上,会不会是驱动没有通过WHQL认证的缘故?
这种方法有局限性吗?是任何含有INF文件的驱动都可以安装吗? 回复 7# yhxhappy
这就不知道了,因该可以安装吧。。。
我只能给你另一个命令
rundll32 setupapi.dll,InstallHinfSection DefaultInstall 128 完整路径.安装.inf 自己顶起来。
那位高手有通过INF文件安装成功过吗,不是自己写的那种驱动哦,比如INTEL芯片组驱动。给展示一个啊
谷歌搜了一下,找到下面一些资料,得到些启发,但看了很多INF文件,安装节不知道定义,很多文件都不是老老实实用 DefaultInstall
rundll32 setupapi.dll,InstallHinfSection DefaultInstall 128 完整路径.安装.inf
注意:
1、其中DefaultInstll是指INF文件中的安装节,必须替换为自己INF中的INSTALL节名,例如节名是USBCamera.Dev,则代码要要改为:
rundll32 setupapi.dll,InstallHinfSection USBCamera.Dev 132 完整路径.安装.inf 最近到处从网上找,发现有一个微软出的小工具 DPInst.exe, 可以通过INF文件安装驱动
DPInst.exe: 安装和卸载驱动程序
缺省情况下,该工具搜索当前目录并安装所有找到的驱动程序
用法: DPInst.exe [/? | /h | /help]
/U INF-file:到.INF文件的路径
/S | /Q:以安静模式卸载一个驱动程序(.INF文件),不显示设备安装向导,阻止操作系统弹出任何对话框
/LM:选择遗产代码模式(进行安装),允许安装无签名的驱动程序和文件不完整的驱动程序。这些驱动程序将无法在最新版本的Windows操作系统上安装
/P:如果要安装的驱动程序不比已安装的好,提示用户
/F:要安装的驱动程序不比已安装的好时,强制(执行当前的)安装(过程)
/SH:扫描硬盘,仅为已存在的设备安装驱动程序。(该选项)仅对即插即用(设备的)驱动(程序)有效
/SA:在 添加/删除程序 (列表)中不显示当前安装的驱动程序
/A:全部安装 或 全不安装
/PATH Path:在指定的路径下搜索驱动程序
/EL:支持所有在.XML文件中未明确列出的语言
/L LanguageID:在所有的用户接口(UI)中使用指定的语言。在 本地化测试 时很有用
/SE:不显示“最终用户许可协议”
/C:将登陆信息输出到控制台(仅在 Windows XP或以上 操作系统上可用)
/D:卸载时删除驱动程序的二进制代码
/SW:不显示设备安装向导,操作系统任然可以弹出对话框
/? | /h | /help:显示此 帮助(信息)
以下是简单的应用(au3源码)
seek("c:\drivers")
Func seek($dir)
If StringRight($dir, 1) <> "\" Then $dir = $dir "\"
$FileList = _FileListToArray($dir, "*", 2)
If UBound($FileList) > 1 Then
For $i = 1 To $FileList
$FileList[$i] = $dir $FileList[$i]
RunWait(@ComSpec ' /c DPInst.exe /LM /SH /SA /PATH '&$FileList[$i]&' /SE /SW',"",@SW_HIDE)
seek($FileList[$i])
Next
EndIf
EndFunc ;==>seek 谢谢你的分享,但是我金钱不够下不到 回复 11# zyj001991
DPInst.exe 用百度或GOOGLE搜这个,都可以下到的 顶你一个。。。。 谢谢 楼主呢。。。。。。。。。
页:
[1]