【问题标题】:CM_Request_Device_Eject fails with PNP_VetoIllegalDeviceRequestCM_Request_Device_Eject 因 PNP_VetoIllegalDeviceRequest 而失败
【发布时间】:2021-11-23 11:36:43
【问题描述】:

我尝试了下面的代码。当设备名称包含“San”时,它会请求弹出,因为我已插入 SanDisk USB 驱动器。但是它失败了,原因似乎是PNP_VetoIllegalDeviceRequest。我查了原因,this page 说是

设备不支持指定的操作。

但我可以使用 Windows 的菜单手动弹出闪迪,所以原因似乎很荒谬。我是否正确调用了该函数?在拨打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;
        }
    }

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    在网上搜索后,我找到了这个页面:https://www.winvistatips.com/threads/removal-of-usb-disk.179677/

    提问者同样的错误,有回复说他需要调用该函数到父节点,而不是U盘节点。所以,我修改了下面的代码,它工作了。

            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);
    

    【讨论】:

    • 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 2012-10-03
    • 2014-07-16
    • 2018-10-04
    • 2020-03-23
    • 2014-05-12
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多