如题,想通过程序实现自动检测设备有没有安装驱动,并为没有驱动的设备安装驱动,安装部分很容易实现,但就不知道如何去检测设备当前是否已安装了驱动,请高人指点一二!谢谢!

解决方案 »

  1.   

    我做安装部署包的时候也需要这样的信息我的做法是一是查找注册表,一般驱动都有一个ID注册信息
    而是查找驱动注册文件,这个大多在system32下会有驱动文件
      

  2.   

    如果装好了驱动,可以在localmachine/currentcontrolset/usb/vid_xxxx&pid_xxxx/driver中查到。
      

  3.   

    读注册表,好像Windows驱动开发详解里有讲
      

  4.   

    setup api SetupDiGetDeviceRegistryProperty
      

  5.   

     //HOWTO:   Enumerate   Hardware   Devices   by   Using   SetupDi   Calls   Q259695 #include   <stdio.h> 
    #include   <windows.h> 
    #include   <setupapi.h> 
    #include   <devguid.h> 
    #include   <regstr.h> 
    #pragma   comment(lib, "Setupapi.lib ") 
    void   printdata(LPVOID   pdata,DWORD   datalen,DWORD   type); int   main(   int   argc,   char   *argv[   ],   char   *envp[   ]   ) 

            HDEVINFO   hDevInfo; 
            SP_DEVINFO_DATA   DeviceInfoData; 
            DWORD   i;         //   Create   a   HDEVINFO   with   all   present   devices. 
            hDevInfo   =   SetupDiGetClassDevs(NULL, 
                    0,   //   Enumerator 
                    0, 
                    DIGCF_PRESENT   |   DIGCF_ALLCLASSES   ); 
            
            if   (hDevInfo   ==   INVALID_HANDLE_VALUE) 
            { 
                    //   Insert   error   handling   here. 
                    return   1; 
            } 
            
            //   Enumerate   through   all   devices   in   Set. 
            
            DeviceInfoData.cbSize   =   sizeof(SP_DEVINFO_DATA); 
            for   (i=0;SetupDiEnumDeviceInfo(hDevInfo,i, 
                    &DeviceInfoData);i++) 
            { 
                    DWORD   DataT; 
                    LPTSTR   buffer   =   NULL; 
                    DWORD   buffersize   =   0; 
                    
                    //   
                    //   Call   function   with   null   to   begin   with,   
                    //   then   use   the   returned   buffer   size   
                    //   to   Alloc   the   buffer.   Keep   calling   until 
                    //   success   or   an   unknown   failure. 
                    //   
                    while   (!SetupDiGetDeviceRegistryProperty( 
                            hDevInfo, 
                            &DeviceInfoData, 
                            SPDRP_DEVICEDESC, 
                            &DataT, 
                            (PBYTE)buffer, 
                            buffersize, 
                            &buffersize)) 
                    { 
                            if   (GetLastError()   ==   
                                    ERROR_INSUFFICIENT_BUFFER) 
                            { 
                                    //   Change   the   buffer   size. 
                                    if   (buffer)   LocalFree(buffer); 
                                    buffer   =   (char*)LocalAlloc(LPTR,buffersize); 
                            } 
                            else 
                            { 
                                    //   Insert   error   handling   here. 
                                    break; 
                            } 
                    }                 
                    printf( "SPDRP_DEVICEDESC:[%s]\n ",buffer); 
    if   (buffer)   LocalFree(buffer); buffer   =NULL; 
    buffersize=0; 
                    while   (!SetupDiGetDeviceRegistryProperty( 
                            hDevInfo, 
                            &DeviceInfoData, 
                            SPDRP_LOCATION_INFORMATION, 
                            &DataT, 
                            (PBYTE)buffer, 
                            buffersize, 
                            &buffersize)) 
                    { 
                            if   (GetLastError()   ==   
                                    ERROR_INSUFFICIENT_BUFFER) 
                            { 
                                    //   Change   the   buffer   size. 
                                    if   (buffer)   LocalFree(buffer); 
                                    buffer   =   (char*)LocalAlloc(LPTR,buffersize); 
                            } 
                            else 
                            { 
                                    //   Insert   error   handling   here. 
                                    break; 
                            } 
                    }                 
                    printf( "SPDRP_LOCATION_INFORMATION:[%s]\n ",buffer);                 
                    if   (buffer)   LocalFree(buffer); buffer   =NULL; 
    buffersize=0; 
                    while   (!SetupDiGetDeviceRegistryProperty( 
                            hDevInfo, 
                            &DeviceInfoData, 
                            SPDRP_ADDRESS, 
                            &DataT, 
                            (PBYTE)buffer, 
                            buffersize, 
                            &buffersize)) 
                    { 
                            if   (GetLastError()   ==   
                                    ERROR_INSUFFICIENT_BUFFER) 
                            { 
                                    //   Change   the   buffer   size. 
                                    if   (buffer)   LocalFree(buffer); 
                                    buffer   =   (char*)LocalAlloc(LPTR,buffersize); 
                            } 
                            else 
                            { 
                                    //   Insert   error   handling   here. 
                                    break; 
                            } 
                    }                 
    printf( "Length:%d,SPDRP_ADDRESS: ",buffersize);       
    printdata(buffer,buffersize,DataT); 
    printf( "\n "); 
                    if   (buffer)   LocalFree(buffer);         } 
            
            
            if   (   GetLastError()!=NO_ERROR   && 
                      GetLastError()!=ERROR_NO_MORE_ITEMS   ) 
            { 
                    //   Insert   error   handling   here. 
                    return   1; 
            } 
            
            //     Cleanup 
            SetupDiDestroyDeviceInfoList(hDevInfo); 
            
            return   0; 
    }   void   printdata(LPVOID   pdata,DWORD   datalen,DWORD   type) 

    if(datalen <=0) 
    return; 
    switch(type) 

    case   REG_DWORD: 

    PDWORD   np=(PDWORD)pdata; 
    printf( "REG_DWORD:%d ",np[0]); 

    break; 
    case   REG_SZ: 
    printf( "REG_SZ:%d ",(LPCTSTR)pdata); 
    break; 
    default: 
    printf( "other   format "); 
    break;