本文主要介绍两种”检测硬件设备“的方法,即”rescan windows device manager“。
一、调Windows DDK的API实现
先用CM_Locate_DevNode得到设备管理树的根结点,然后用CM_Reenumerate_DevNode以这个根结点为参数刷新它就搞定!在MSDN里面可以查到这两个函数的用法,相关的知识里面也有。(该方法转自点击打开链接,原代码因为版本问题,在我的host编译不过,有小许改动,另外参考msdn:CM_Locate_DevNode和CM_Reenumerate_DevNode)其中,CM——Config Manager。
新建一个默认的win32控制台工程,修改main.cpp如下:
<span style="font-size:14px;">#include "stdafx.h" #include <windows.h> #include <cfgmgr32.h> #pragma comment(lib,"cfgmgr32") int main() { DEVINST devInst; CONFIGRET status; //得到设备管理树的根结点 status = CM_Locate_DevNode(&devInst, NULL,CM_LOCATE_DEVNODE_NORMAL); if (status != CR_SUCCESS) { printf("CM_Locate_DevNode failed: %x\n ", status); return FALSE; } //刷新 status = CM_Reenumerate_DevNode(devInst, CM_REENUMERATE_ASYNCHRONOUS); //CM_REENUMERATE_ASYNCHRONOUS 异步方式可以立即响应 if (status != CR_SUCCESS) { printf("CM_Reenumerate_DevNode failed: %x\n ", status); return FALSE; } return 0; }</span>
1,需要包含windows.h文件。
2,需要包含cfgmgr32.h文件(Config Manager 32)。
3,需要将cfgmgr32.lib静态加载进来,(#pragma comment(lib,"cfgmgr32") )参考百度百科:点击打开链接。
事实上,应用程序调驱动程序的时候,也要“#include <setupapi.h>”和“#pragma comment(lib,"setupapi")”。
4,以上两条主要是包含DDI的库,它需要安装wdk。如果没安装wdk,也可以将cfgmgr32.h、cfgmgr32.lib和cfgmgr32.dll拷贝到你的工程目录下。因为CM_Locate_DevNode和CM_Reenumerate_DevNode被封装在cfgmgr32.dll中。
5,对于CM_Locate_DevNode函数,它的第二个参数表示设备句柄ID,如果为空,则指向根节点。
A pointer to a NULL-terminated string representing a device instance ID. If this value is NULL, or if it points to a zero-length string, the function retrieves a device instance handle to the device at the root of the device tree.
参考我之前的博文:点击打开链接,在CMD中调用“devcon rescan”即可刷新设备管理器。在此基础上,我们通过一个bat文件封装对devcon的调用,然后再在程序中调用CreateFile打开运行这个bat文件即可。该方法参考博文:点击打开链接,具体步骤如下:
1,下载devcon.exe。该工具在wdk10中自带。
2,新建restart.dat文件,并输入“@devcon rescan”。
3,实现代码如下,同样的,先新建win32工程,修改main.cpp文件如下:
<span style="font-size:14px;">#include "stdafx.h" #include <windows.h> int main() { STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; PROCESS_INFORMATION pi; BOOL res = CreateProcess(L"restart.bat", NULL, NULL, NULL, NULL, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); if (TRUE == res) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return true; } else { return false; } return 0; }</span>
注:本文属于windows pnp configuration manager 范畴,可以在MSDN中查看相关文章。另,网友的博客系列文章,是一个很好的smaple:仿91助手的PC与Android手机通讯,共4篇系列文章