我要做一个驱动自动安装的安装程序,要在XP下安装驱动。
我这里共两个文件,一个.inf,一个.sys。
参考了论坛里几位前辈的贴子,谈论的方法都是在InstallShield里,
在某处(比如OnFirstUIAfter函数)加上如下代码:
//==============================================
//...
string szProgram; 
string szCmdLine;
//...
szProgram = "rundll32.exe";
szCmdLine = "setupapi.dll,InstallHinfSection 你要执行的section名 132" + "你的.inf文件所在全路径名"; 
LaunchAppAndWait(szProgram, szCmdLine, WAIT); 
//==============================================
其实InstallShield内部的实现是调用Windows API函数orShellExecuteEx(orShellExecute),
于是我就自己写了个程序来实现如上代码效果,以下是我在MFC里写的代码:
//==============================================
::ShellExecute(NULL, "open", "rundll32.exe", 
          "setupapi.dll, InstallHinfSection PwSwpDrv.Dev 132     c:\\driver\\pwswpdrv.inf",
           "c:\\driver", SW_SHOWNORMAL);
//==============================================
我的两个文件.inf和.sys放在C盘的自己建的driver目录下。
程序执行的结果是:
1.因为指定了SW_SHOWNORMAL,所以出现了一个将.sys文件拷到c:\windows\system32\driver目录下的一个对话框。
2.也是最关键的:我在c:\windows\inf目录下发现我的.inf文件已成功地转化为oem13.inf(我机器里是oem13,这个数字是不一定的,视机器而定);在c:\windows\system32\driver目录下也发现我的.inf文件,名字没变。按理说出现了刚才的第2点,安装已经成功,为什么我的驱动还无法正常工作?设备管理器里我的设备还是有个感叹号,而且点查看驱动详细信息时,出现该设备没有安装驱动。请问大家各路高手,到底该如何实现驱动的自动安装?谢谢!!!

解决方案 »

  1.   

    那得看你的Inf是怎么写的,怀疑你的Inf文件没有指向你的驱动的位置。
      

  2.   

    inf文件放在windows的inf目录下
    sys文件放在system32的drivers目录下
      

  3.   

    谢谢楼上的wangk(倒之)的热心!
    我也怀疑过.inf文件的格式。
    所以,另一个问题就是为什么由Windows自动带的安装程序来装为什么却可以安装成功?
    我的.inf文件的我发布一下,请帮忙指点哦!感激不尽!~
    ;=====================================================================
    ; pwswpdrv.inf  Pinewave Fingerprint Reader

    ;=====================================================================[Version]
    Signature="$CHICAGO$"
    Class=Fingerprint
    ClassGUID={BB199E33-22A8-483e-A206-61A29EC93EE4}
    provider=%PineWave%
    DriverVer=01/20/2005,1.0.0.0[ClassInstall32]
    Addreg=DeviceClass[ClassInstall]
    Addreg=DeviceClass[DeviceClass]
    HKR,,,,%DeviceClassName%
    HKR,,Icon,,"-18"[Manufacturer]
    %PineWave%=PineWave[PineWave]
    %AES2500REFBoard%=PwSwpDrv.Dev, USB\VID_08FF&PID_2500
    %AES2501REFBoard%=PwSwpDrv.Dev, USB\VID_08FF&PID_2501[DestinationDirs]
    PwSwpDrv.Files.Ext = 10,System32\Drivers
    DefaultDestDir = 11[PwSwpDrv.Dev]
    CopyFiles=PwSwpDrv.Files.Ext
    AddReg=PwSwpDrv.AddReg[PwSwpDrv.Dev.NT]
    CopyFiles=PwSwpDrv.Files.Ext
    AddReg=PwSwpDrv.AddReg[PwSwpDrv.Dev.NT.Services]
    Addservice = Pwswpdrv, 0x00000002, PwSwpDrv.AddService[PwSwpDrv.AddService]
    DisplayName    = %PwSwpDrv.SvcDesc%
    ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
    StartType      = 3                  ; SERVICE_DEMAND_START
    ErrorControl   = 1                  ; SERVICE_ERROR_NORMAL
    ServiceBinary  = %10%\System32\Drivers\pwswpdrv.sys
    LoadOrderGroup = Base[PwSwpDrv.AddReg]
    HKR,,DevLoader,,*ntkern
    HKR,,NTMPDriver,,pwswpdrv.sys[PwSwpDrv.Files.Ext]
    pwswpdrv.sys[Strings]
    PineWave="Shanghai PineWave"AES2500REFBoard="Fingerprint Reader (AES2500)"
    AES2501REFBoard="Fingerprint Reader (AES2501)"PwSwpDrv.SvcDesc="PineWave Fingerprint USB Driver (pwswpdrv.sys)"
    Disk1Name="Fingerprint Device CD-ROM"
    DeviceClassName="Fingerprint
      

  4.   

    To cczlp(不惑) :
    你说的是指安装完成后才会这样的。
    安装之前我的.inf和.sys文件可以放其他地方的啊
      

  5.   

    [PwSwpDrv.AddReg]
    HKR,,DevLoader,,*ntkern
    HKR,,NTMPDriver,,pwswpdrv.sys这两行代码对注册表进行了什么操作?
      

  6.   

    ;=====================================================================
    ; pwswpdrv.inf  Pinewave Fingerprint Reader
    ; 改成这样试一下
    ;=====================================================================[Version]
    Signature="$CHICAGO$"
    Class=Fingerprint
    ClassGUID={BB199E33-22A8-483e-A206-61A29EC93EE4}
    provider=%PineWave%
    DriverVer=01/20/2005,1.0.0.0[ClassInstall32]
    Addreg=DeviceClass[ClassInstall]
    Addreg=DeviceClass[DeviceClass]
    HKR,,,,%DeviceClassName%
    HKR,,Icon,,"-18"[Manufacturer]
    %PineWave%=PineWave[PineWave]
    %AES2500REFBoard%=PwSwpDrv.Dev, USB\VID_08FF&PID_2500
    %AES2501REFBoard%=PwSwpDrv.Dev, USB\VID_08FF&PID_2501[DestinationDirs]
    PwSwpDrv.Files.Ext = 10,System32\Drivers
    PwSwpDrv.Files.Inf = 10,INF[PwSwpDrv.Dev]
    CopyFiles=PwSwpDrv.Files.Ext
    AddReg=PwSwpDrv.AddReg[PwSwpDrv.Dev.NT]
    CopyFiles=PwSwpDrv.Files.Ext
    AddReg=PwSwpDrv.AddReg[PwSwpDrv.Dev.NT.Services]
    Addservice = Pwswpdrv, 0x00000002, PwSwpDrv.AddService[PwSwpDrv.AddService]
    DisplayName    = %PwSwpDrv.SvcDesc%
    ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
    StartType      = 3                  ; SERVICE_DEMAND_START
    ErrorControl   = 1                  ; SERVICE_ERROR_NORMAL
    ServiceBinary  = %10%\System32\Drivers\pwswpdrv.sys
    LoadOrderGroup = Base[PwSwpDrv.AddReg]
    HKR,,DevLoader,,*ntkern
    HKR,,NTMPDriver,,pwswpdrv.sys[PwSwpDrv.Files.Ext]
    pwswpdrv.sys[PwSwpDrv.Files.Inf];----------------------------------[SourceDisksNames.x86]
    1 = %DiskId1%,,,""[SourceDisksFiles]
    ; Files for disk PineWave. Installation Disk #1 (System)
    pwswpdrv.sys = 1
    pwswpdrv.inf = 1[Strings];
    ; Non-Localizable Strings
    ;REG_SZ         = 0x00000000
    REG_MULTI_SZ   = 0x00010000
    REG_EXPAND_SZ  = 0x00020000
    REG_BINARY     = 0x00000001
    REG_DWORD      = 0x00010001
    SERVICEROOT    = "System\CurrentControlSet\Services"PineWave="Shanghai PineWave"AES2500REFBoard="Fingerprint Reader (AES2500)"
    AES2501REFBoard="Fingerprint Reader (AES2501)"PwSwpDrv.SvcDesc="PineWave Fingerprint USB Driver (pwswpdrv.sys)"
    DiskId1="Fingerprint Device CD-ROM"
    DeviceClassName="Fingerprint"
      

  7.   

    最好用工具生成Inf文件。
    DDK中的GenInf就可以满足你的要求。
      

  8.   

    To wangk(倒之) :
       我换成你的.inf文件,结果还是老样子,用Windows自带的安装程序正常,但是以我那样安装还是出现老问题,同样生成oem*.inf的。
      

  9.   

    我觉得应该没有错。同样生成oem*.inf没有关系,是正常的。
    关键是为什么驱动没起作用?你看看注册表里面的键值正确吗?
    另外你是用GenInf产生的Inf文件吗?
      

  10.   

    不是用GenInf产生的。。
    另外,查看了注册表下的
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
    然后根据我的ClassGUID找到我的那些条目,有0000, 0001,发现这两个内容是一样的
    而且我查看了用Windows自带安装成功后的这些条目信息和自己做的安装程序安装后的这些条目信息是一样的。
    我那个设备是USB设备,我在MSDN里查“HKR”,出来结果:
    [section name]: cannot handle HKRSee Also
    MessagesThe registry key is used by an .inf file that is not a Plug and Play device .inf file.ResolutionContact Microsoft Product Support Services to gain access to the appropriate registry key for the Plug and Play device.似乎是说HKR不支持即插即用设备?
      

  11.   

    我说的是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下面添加了驱动,键值正确吗?
      

  12.   

    我用Windows自带的安装成功后,并没发现在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下有我的东西啊。
      

  13.   

    你应该能在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下发现PwSwpDrv的驱动,
    里面的信息,应该正确才是。
      

  14.   

    我把GenInf发给你了,你用它产生的Inf文件安装试一试。
      

  15.   

    在安装程序之外写一个执行安装功能的小程序,可以在DDK\\src\\setup……找得到,我去看了,同时我也在MSDN上找到了一个文章,就是介绍这个小程序的的http://support.microsoft.com/default.aspx?scid=http://support.microsoft..com:80/support/kb/articles/q311/2/72.asp&NoWebContent=1 
    有兴趣自己去看看,我就不罗嗦啦。 现在我手上有的资料可以使我有两种安装方式,一个是通过InstallShield在安装过程中通过脚本来调用Devcon来实现安装;还有一个是通过在脚本中调用rundll32来实现安装。 顺遍提一下,关于INF文件安装需要调用的函数说明,具体说明请参看Microsoft的MSDN 
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/setupapi/setup/installing_from_an_inf_file.asp 
      

  16.   

    编写INF文件时,参看DDK中"Installation Requirements for Network Protocols"。如果安装失败,请检查%systemroot%\setupapi.log文件。
    假设用NCPA安装INF文件时碰到如下错误信息:> Error E000020B in UpdateDriverForPlugAndPlayDevices: ERROR_NO_SUCH_DEVINST> #E154 类别安装程式失败。 错误 0xe0000208: 操作无法在尚未注册的设备信息元素上运行。请立即用chkinf.bat(DDK自带工具)检查一下INF文件,此时可能有低级错误出现,比
    如"AddReg项不在正确的节内"。
      

  17.   

    主要是用DDK驱动安装函数根据*.inf文件来安装驱动:
    在win2000及win2000以上系统:
    a.没插上设备,安装驱动:
    1.用SetupCopyOEMInf()函数将驱动的安装文件(*.inf)拷贝到\inf目录中,并自动生成了oem*.inf预安装文件
    2.用msdn中的SetupInstallFilesFromInfSection()函数根据*.inf文件中的安装段,将相应的驱动文件拷贝到系统中.
    3.插上设备,系统会弹出"发现新新的硬件向导",只要点击下一步直至完成即可完成设备的驱动安装.
    b.插上设备,安装驱动:
    1.从*.inf文件中
       ...
       [Manufacturer]
        %WinChipHead% = WinChipHead
       [WinChipHead]
        %CH375.DeviceDesc% = CH375.Install, USB\VID_4348&PID_5537
        %CH375HM.DeviceDesc% = CH375.Install, USB\VID_4348&PID_55E0
        ...
       获取hardwareid号USB\VID_4348&PID_5537,USB\VID_4348&PID_55E0;
      2. 用UpdateDriverForPlugAndPlayDevices()自动安装新驱动!
    在98,me系统下:只要将inf文件拷贝到\inf目录下,用SetupInstallFilesFromInfSection函数将驱动文件拷贝到相应的目录下,更新驱动程序信息,插上设备,系统就会自动安装驱动.(有个更新驱动信息的办法,将\inf目录下的drvidx.bin删掉,插上新设备,系统会自动更新驱动信息).
    大体上就是这样!