如何用程序实现“rescan windows device manager"

        本文主要介绍两种”检测硬件设备“的方法,即”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,如果为空,则指向根节点。

pDeviceID [in, optional]

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.


二、借助devcon.exe

    参考我之前的博文:点击打开链接,在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篇系列文章

你可能感兴趣的:(如何用程序实现“rescan windows device manager")