想弹出u盘,但是把usb鼠标也卸载了?

job82824 2010-08-24 10:16:45

//这个其实是网上直接抄来的代码,大家能帮忙看下问题所在吗?
#include <windows.h>
#include <Setupapi.h>
#include <cfgmgr32.h>
#include <initguid.h>

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

DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,
0xA5DCBF10L,0x6530,0x11D2, 0x90,0x1F,0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE

//绿色的地方好像没什么用,我就给屏蔽了。
int PopupAllUSBDisk()
{
int Result = 0;
DWORD i;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
//--------------------------------------------------------------------------
// 获取设备信息
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,
0,// Enumerator
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(hDevInfo == INVALID_HANDLE_VALUE)
{
// 查询信息失败
//printf("ERROR - SetupDiGetClassDevs()");
return 1;
}
//--------------------------------------------------------------------------
// 枚举每个USB设备
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for(i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++)
{
LPTSTR buffer = NULL;
PVOID buffer2 = NULL;
DWORD buffersize = 0;
ULONG len;
CONFIGRET cr;
PNP_VETO_TYPE pnpvietotype;
TCHAR vetoname[MAX_PATH];
ULONG ulStatus;
ULONG ulProblemNumber;

cr = CM_Get_DevNode_Status(&ulStatus,
&ulProblemNumber,
DeviceInfoData.DevInst,
0);
/*if(CR_SUCCESS == cr)
{
printf("OK - CM_Get_DevNode_Status()[%d]\n", cr);
printf("OK - CM_Get_DevNode_Status() sts [%x]\n", ulStatus);
printf("OK - CM_Get_DevNode_Status() pro [%x]\n", ulProblemNumber);
}
else
{
printf("ERROR - CM_Get_DevNode_Status()[%d]\n", cr);
printf("ERROR - CM_Get_DevNode_Status()[%d]\n", GetLastError());
}*/
if(CR_SUCCESS != cr)
Result++;
// DN_DISABLEABLE or DN_REMOVABLE
/*if((DN_DISABLEABLE & ulStatus) != 0)
{
Result++;
//printf("HAS - DN_DISABLEABLE()[%x]\n", DN_DISABLEABLE & ulStatus);
}
else
{
continue;
}
if((DN_REMOVABLE & ulStatus) != 0)
{
printf("HAS - DN_REMOVABLE()[%x]\n", DN_REMOVABLE & ulStatus);
}
else
{
continue;
}*/

len = MAX_PATH;
// pnpvietotype = PNP_VetoDevice;
cr = CM_Request_Device_EjectW(DeviceInfoData.DevInst,&pnpvietotype,vetoname,len,0);//没有气泡提示
//cr = CM_Request_Device_EjectW(DeviceInfoData.DevInst,&pnpvietotype,NULL,0,0);//有气泡提示
/*if(CR_SUCCESS == cr)
{
printf("OK - CM_Request_Device_Eject()[%d]\n", cr);
}
else
{
printf("ERROR - CM_Request_Device_Eject()[%d]\n", cr);
printf("ERROR - CM_Request_Device_Eject()[%d]\n", GetLastError());
}*/
if(CR_SUCCESS != cr)
Result++;
}

if(GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS)
{
// Insert error handling here.
return 1;
}

// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);

return Result;

这个有办法改一下吗?就是不要把鼠标给卸载了?
...全文
535 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
job82824 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fly4free 的回复:]

本贴真是大补啊,你的问题是因为我的回帖而解决了吗?
不然100分受之有愧啊。。。
[/Quote]
,你的回答没有直接解决我的问题,但是的确给了我一个思路,然后我又去查找了这个头文件的所有函数,终于找到了答案:)
fly4free 2010-09-03
  • 打赏
  • 举报
回复
本贴真是大补啊,你的问题是因为我的回帖而解决了吗?
不然100分受之有愧啊。。。

job82824 2010-09-03
  • 打赏
  • 举报
回复
返回的TCHAR的确是不一样的。
u盘1: USB\VID_058F&PID_6387\ZXKDVWKK
u盘2: USB\VID_1221&PID_3234\0001CFCFCFC5DB2D
USB鼠标: USB_VID_15D9&PID_0A37\5&21BFE1E&0&2
不同的u盘和鼠标键盘肯定不一样的,但是这个规律是.......
job82824 2010-09-03
  • 打赏
  • 举报
回复
呵呵,找到了。我去试试
job82824 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fly4free 的回复:]

此外:
cr = CM_Request_Device_EjectW(DeviceInfoData.DevInst,&pnpvietotype,vetoname,len,0);

你在执行这句代码前
使用 CM_Get_Devicce_ID , 把 DeviceInfoData.DevInst 传进去。看看获得的设备实例ID串内容是啥。
[/Quote]
CM_Get_Devicce_ID没有这个函数,在cfgmgr32.h文件中
fly4free 2010-09-03
  • 打赏
  • 举报
回复
嗯?还是一起都删掉了? 你try下多插几个不同类型的USB设备,然后再调用那个函数
看看是否是全部都被安全删除了?

此外:
cr = CM_Request_Device_EjectW(DeviceInfoData.DevInst,&pnpvietotype,vetoname,len,0);

你在执行这句代码前
使用 CM_Get_Devicce_ID , 把 DeviceInfoData.DevInst 传进去。看看获得的设备实例ID串内容是啥。
job82824 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fly4free 的回复:]

你的代码明显是把所有 USB 设备都弹出了
你需要判断该设备是不是U盘。

你直接枚举 "USBSTOR" 设备的话,也是可以弹出U盘的。
[/Quote]
我试过了上面的方法,就是判断下SP_DEVINFO_DATA结构里面的GUID ClassGuid,但是在使用那个CM_Request_Device_EjectW弹出u盘时判断没起作用,鼠标还是被卸载了。我现在只是想要个卸载,不需要查询与读写usb设备的。
fly4free 2010-09-01
  • 打赏
  • 举报
回复
你的代码明显是把所有 USB 设备都弹出了
你需要判断该设备是不是U盘。

你直接枚举 "USBSTOR" 设备的话,也是可以弹出U盘的。
job82824 2010-08-30
  • 打赏
  • 举报
回复
找到原因了--只是少了个头文件#include <dbt.h>而已...
job82824 2010-08-30
  • 打赏
  • 举报
回复
这个好像需要个psdk,但我不知道哪里有下载的?XP下面的。
job82824 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 m_tornado 的回复:]

http://topic.csdn.net/u/20100715/16/f35534f3-08c6-4fb6-9dee-37d6fc86ad72.html

里面的代码我用过的,不会删除USB鼠标键盘啥的~
[/Quote]
嘿,看起来还行,先去试下,3x。
  • 打赏
  • 举报
回复
从注册表中找到 DeviceInfoData.ClassGuid 的设备类型和设备名.
m_tornado 2010-08-24
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100715/16/f35534f3-08c6-4fb6-9dee-37d6fc86ad72.html

里面的代码我用过的,不会删除USB鼠标键盘啥的~
m_tornado 2010-08-24
  • 打赏
  • 举报
回复
不会啊~坛子上有好的代码,我用过的,封装成一个函数自己调用,我看看链接~

2,640

社区成员

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

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