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能否完成和鼠标点击右下角图标同样的效果?

望高手指点,谢谢。
...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kezhu 2003-08-10
  • 打赏
  • 举报
回复
ding
hongliqiu 2003-07-30
  • 打赏
  • 举报
回复
听课来了。
kezhu 2003-07-29
  • 打赏
  • 举报
回复
to:yyszh(I love C)
我的系统是xp,去掉了缓存属性(界面上是两个RadioButton供选择),但在2000下,只有一个CheckBox,还是灰的,无法修改,在xp下我找到了这个属性在注册表中的位置,但在2000下却没有这个键值。
kezhu 2003-07-29
  • 打赏
  • 举报
回复
to:yyszh(I love C)
去掉了缓存属性之后,确实可以删除成功了,但该如何去掉直接拔出u盘时的系统提示?还有就是如何用程序修改这个属性?在注册表中什么地方?能不能在未插u盘时修改?

to:h13bk(道人)
我在北大天网上下载了bcb6_eng_ent_upd4.exe,但安装后调用依然失败,我犯了个错误,程序不是运行到SetupDiRemoveDeviceInterface才有错误的,实际到SetupDiEnumDeviceInterfaces就失败了,GetLastError得到的是259,也就是ERROR_NO_MORE_ITEMS,你既然能到SetupDiGetDeviceInterfaceDetail才出错,那SetupDiEnumDeviceInterfaces应该正常通过,请问有什么特别值得注意的地方吗?

to:joyous(SAKER)
我不是手动操作,而是一个自动控制的操作过程,不可能用眼睛去看灯,也不可能让用户去点击托盘图标,只是希望达到点击托盘图标的效果。
___NULL 2003-07-29
  • 打赏
  • 举报
回复
U盘上有个灯,任何操作等灯闪完的;还有就是利用系统来关闭设备,在托盘上的一个图标,否则可能导致设备故障
h13bk 2003-07-28
  • 打赏
  • 举报
回复
如果你用的是BCB6,可能要打patch4,我在cb5下调用SetupDiGetDeviceInterfaceDetail函数正常,6就不行了,打个patch再试试调用的setupdi函数
yyszh 2003-07-28
  • 打赏
  • 举报
回复
即插型U盘在写入时Windows 2000使用缓存,所以你直接拔掉U盘会丢失数据。应该可以通过设置禁用写入缓存吧。
在设备管理器里:
点该磁盘设备->右键->属性->磁盘属性->勾掉启用了写入缓存
应该可以了吧。
我的U盘是加密型,没有写入缓存,所以可以随时插拔。

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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