阅读:1652回复:5
u盘文件操作的问题
比如在u盘上删除一个文件,删除后立刻直接拔掉u盘,系统会出现提示框,再将u盘插入后,发现被删除的文件还在,但如果删除文件后用鼠标点击右下角图标删除设备的话,不出现提示框,文件也确实被删除了。
于是查了一些资料,有以下收获,但也有问题: 不出现提示框的方法大概查到了 在IRP_MN_QUERY_CAPABILITIES的处理函数中设置: PDEVICE_CAPABILITIES::SurpriseRemovalOK=TRUE; PDEVICE_CAPABILITIES::Removable=TRUE; PDEVICE_CAPABILITIES::EjectSupported=TRUE; PDEVICE_CAPABILITIES::WarmEjectSupported=TRUE; 这样,在System Tray中的“插入硬件“的图标也没有了。具体例子,可以参考DriverWorks中的USBTherm。 1、我的程序只是普通的应用程序,不是驱动程序开发,所以在应用程序中如何完成上述的处理。 2、即便系统不弹出提示框,但文件操作是否能保证正确呢? 删除设备的方法查到了SetupDi系列函数,其中 1、SetupDiRemoveDevice可以删除设备,但它连驱动程序也一起删除了,再插上u盘时系统会用半分钟时间重新安装驱动程序,客户无法接受。 2、SetupDiSetClassInstallParams可以停用和启用设备,但停用后在设备管理器里无法启动,必须用启用程序启用该设备,与用鼠标点击右下角图标的效果不同,而且停用设备有时也耗时半分钟。 3、SetupDiRemoveDeviceInterface也许可以完成要求,因为我调用一直失败,函数原型是: BOOLEAN SetupDiRemoveDeviceInterface( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ); 其中DeviceInfoSet是用SetupDiGetClassDevs得到的。 DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes \"USB\", 0, DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices DeviceInterfaceData是用SetupDiEnumDeviceInterfaces得到的 SetupDiEnumDeviceInterfaces(DeviceInfoSet, &DeviceInfoData, &guid, i, &DeviceInterfaceData)) i是循环变量,DeviceInfoData是用SetupDiEnumDeviceInfo得到的 SetupDiEnumDeviceInfo(DeviceInfoSet, i, &DeviceInfoData) guid是利用HardwareID(大概格式为\"USB\\Vid_04b0&Pid_0301\")在注册表中HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\下查找设备,再取出ClassGUID得到的。 总之,在调用了这一系列函数后,最后调用SetupDiRemoveDeviceInterface返回false,GetLastError=87,非法参数,请问是哪里错了?SetupDiRemoveDeviceInterface能否完成和鼠标点击右下角图标同样的效果? 望高手指点,谢谢。 |
|
最新喜欢:![]() |
沙发#
发布于:2003-07-29 13:11
犯了个错误,程序运行到SetupDiEnumDeviceInterfaces就已经有问题了,后面肯定过不去,GetLastError=259,ERROR_NO_MORE_ITEMS。
GUID可以从注册表中查到,也可以用SetupDiGetDeviceRegistryProperty得到。 |
|
板凳#
发布于:2003-07-30 13:47
好像大家都遇到过SetupDiEnumDeviceInterfaces失败这个问题,并且都解决了,谁能具体说一下是怎么解决的呀?
抄了很多代码都不成功,我的环境是bcb6。 |
|
地板#
发布于:2003-08-01 13:18
帮帮我呀。
|
|
地下室#
发布于:2003-09-29 13:00
请问bcb下可以调试需要ddk的引用程序吗?
|
|
5楼#
发布于:2003-10-23 06:26
应该是GUID的值不对
|
|