u盘文件操作的问题
kezhu 2003-07-28 01:38:39 比如在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能否完成和鼠标点击右下角图标同样的效果?
望高手指点,谢谢。