[C++] 如何判断设备有没有安装驱动? 如题,想通过程序实现自动检测设备有没有安装驱动,并为没有驱动的设备安装驱动,安装部分很容易实现,但就不知道如何去检测设备当前是否已安装了驱动,请高人指点一二!谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我做安装部署包的时候也需要这样的信息我的做法是一是查找注册表,一般驱动都有一个ID注册信息而是查找驱动注册文件,这个大多在system32下会有驱动文件 如果装好了驱动,可以在localmachine/currentcontrolset/usb/vid_xxxx&pid_xxxx/driver中查到。 读注册表,好像Windows驱动开发详解里有讲 setup api SetupDiGetDeviceRegistryProperty //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; } } 请教贴:MFC/VC/C/C++本质有什么不同 关于IE的"安全警报" 如何得到MoveTo、LineTo方法绘制的直线上的点? 关于文件路径 +文件名称的问题 急问!关于BitBlt和StretchBlt的奇怪问题!!~~ 多视图的实现的问题,等待。 怎样判断CEdit是密码输入框? 程序中如何实现选中某文件后按回车键就打开该文件。也就是相当于鼠标双击的功能。 .cfm是什么文件,用什么软件打开? 请问在Vc++中如何编译c的文件,我在编译时老报C1010的错误. 关于dll创建窗体的问题 数据库读取多表出现了问题,odbc
而是查找驱动注册文件,这个大多在system32下会有驱动文件
#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;
}
}