我试过下面的代码。当设备名称包含"San“时,它请求弹出,因为我已经插入了一个SanDisk USB驱动器。然而,它失败了,原因似乎是PNP_VetoIllegalDeviceRequest。我查了一下原因,此页说是
设备不支持指定的操作。
但我可以使用Windows菜单手动弹出SanDisk,因此原因似乎是荒谬的。我正确地调用了函数吗?在调用CM_Request_Device_Eject之前,我需要调用其他的东西吗?
输出是
....
SanDisk Ultra USB Device
Removing Sandisk
rejected.
type:8
name:USBSTOR\Disk&Ven_SanDisk&Prod_Ultra&Rev_1.00\....代码是( Devinst的值是3)
if (wcsstr(buffer, L"San") != 0)
{
wcout << "Removing Sandisk" << endl;
PNP_VETO_TYPE vType;
WCHAR vName[MAX_PATH];
result = CM_Request_Device_Eject(Devinst, &vType, vName, MAX_PATH, NULL);
if (result == CR_SUCCESS)
{
cout << "ejected" << endl;
}
else
{
wcout << "rejected." << endl;
wcout << "type:"<< vType << endl;
wcout << "name:" << vName << endl;
}
}发布于 2021-10-01 23:16:12
在搜索完网页后,我找到了以下页面:https://www.winvistatips.com/threads/removal-of-usb-disk.179677/
发问者也有同样的错误,有一个答复说他需要调用父节点,而不是USB磁盘节点。所以,我按照下面的方式修改了代码,它起了作用。
DEVINST parent;
CM_Get_Parent(&parent, Devinst, NULL);
PNP_VETO_TYPE vType;
WCHAR vName[MAX_PATH];
result = CM_Request_Device_Eject(parent, &vType, vName, MAX_PATH, NULL);https://stackoverflow.com/questions/69412352
复制相似问题