枚举USB设备时,cfgmgr32.h(122)错误的解决

查了一下午的Google和百度,终于在下面的网址里找到了解决方法:

http://bbs2.driverdevelop.com/simple/?t91710.html

网上最多的解决方法就是:

将WinDDK\2006\Inc\wxp的目录加到Tools-Options-Directories-Include Files中,并且放在最前面。

但是这样做的结果会造成Winreg.h的错误。

最后,我是这样解决的:

一、在Tools-Options-Directories中,

01、WinDDK\2006\Inc\wxp目录加入Include Files里;

02、WinDDK\2600\lib\wxp\i386目录加入Library files里;

上述两个目录均放在最后。

二、引用头文件的方法:

01、

typedef unsigned long ULONG_PTR, *PULONG_PTR;
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
#include <cfgmgr32.h>
02、
#include <winioctl.h>
#include <usbioctl.h>

extern "C"{
#include <hidsdi.h>
#include <setupapi.h>
}
三、导入库文件:

#pragma comment(lib, "hid.lib")
#pragma comment(lib, "cfgmgr32.lib")
#pragma comment(lib, "setupapi.lib")

对应头文件和库文件,没有特意注意他们的顺序。

有些人认为#include <cfgmgr32.h>要在#include <setupapi.h>,好像不需要,现在编译没出现什么错误。

另外,系统是:VC++6.0,WindowXPSP3

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
禁用设备管理器中的显卡设备需要管理员权限,因此需要先获取管理员权限。以下是一个禁用显卡设备的示例代码: ```c++ #include <Windows.h> #include <cfgmgr32.h> int main() { // 获取管理员权限 if (!IsUserAnAdmin()) { ShellExecute(NULL, "runas", __FILE__, NULL, NULL, SW_SHOWNORMAL); return 0; } // 枚举设备 CONFIGRET cr = CR_SUCCESS; ULONG ulSize = 0; cr = CM_Get_Device_ID_List_Size(&ulSize, NULL, CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT); if (cr != CR_SUCCESS) { return 1; } PWSTR pszBuffer = new WCHAR[ulSize]; ZeroMemory(pszBuffer, ulSize * sizeof(WCHAR)); cr = CM_Get_Device_ID_List(NULL, pszBuffer, ulSize, CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT); if (cr != CR_SUCCESS) { delete[] pszBuffer; return 1; } // 禁用显卡设备 ULONG ulLength = wcslen(pszBuffer); for (ULONG i = 0; i < ulLength; i += wcslen(pszBuffer + i) + 1) { DEVINST devInst; cr = CM_Locate_DevNode(&devInst, pszBuffer + i, CM_LOCATE_DEVNODE_NORMAL); if (cr == CR_SUCCESS) { ULONG ulStatus = 0; ULONG ulProblemNumber = 0; cr = CM_Get_DevNode_Status(&ulStatus, &ulProblemNumber, devInst, 0); if (cr == CR_SUCCESS && (ulStatus & DN_HAS_PROBLEM) == 0) { cr = CM_Disable_DevNode(devInst, CM_DISABLE_POLITE); if (cr == CR_SUCCESS) { printf("Device %ws is disabled.\n", pszBuffer + i); } else { printf("Failed to disable device %ws.\n", pszBuffer + i); } } } } delete[] pszBuffer; return 0; } ``` 该代码首先获取管理员权限,然后枚举设备列表,对于每个设备,如果它没有故障,就禁用它。禁用设备需要使用 `CM_Disable_DevNode` 函数,第二个参数可以指定禁用方式,这里使用的是 `CM_DISABLE_POLITE`,表示要先关闭设备上已打开的所有句柄,然后再禁用设备

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值