[C++] 如何判断设备有没有安装驱动?

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

谢谢!
...全文
1634 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-07-06
  • 打赏
  • 举报
回复
读注册表,好像Windows驱动开发详解里有讲。。。
MoXiaoRab 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 blpluto 的回复:]
我做安装部署包的时候也需要这样的信息

我的做法是一是查找注册表,一般驱动都有一个ID注册信息
而是查找驱动注册文件,这个大多在system32下会有驱动文件
[/Quote]
同意
用户 昵称 2010-07-06
  • 打赏
  • 举报
回复
如果装好了驱动,可以在localmachine/currentcontrolset/usb/vid_xxxx&pid_xxxx/driver中查到。
zhourenyun 2010-07-06
  • 打赏
  • 举报
回复
尝试去打开设备,能正常打开应该已经安装设备了吧。
blpluto 2010-07-06
  • 打赏
  • 举报
回复
我做安装部署包的时候也需要这样的信息

我的做法是一是查找注册表,一般驱动都有一个ID注册信息
而是查找驱动注册文件,这个大多在system32下会有驱动文件
向立天 2010-07-06
  • 打赏
  • 举报
回复
是不是可以查注册表啊
nostopping 2010-07-06
  • 打赏
  • 举报
回复
谢谢各位朋友的提示,我先试试。
有不同想法的朋友可以继续讨论呀,再次感谢!
dream17953 2010-07-06
  • 打赏
  • 举报
回复
10分可用分
na_he 2010-07-06
  • 打赏
  • 举报
回复
//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;
}
}
船过水无痕 2010-07-06
  • 打赏
  • 举报
回复
setup api SetupDiGetDeviceRegistryProperty
nostopping 2010-07-05
  • 打赏
  • 举报
回复
功能类似于驱动人生和驱动精灵!

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧