kezhu
驱动牛犊
驱动牛犊
  • 注册日期2003-07-16
  • 最后登录2004-05-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1652回复:5

u盘文件操作的问题

楼主#
更多 发布于:2003-07-28 11:09
比如在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能否完成和鼠标点击右下角图标同样的效果?

望高手指点,谢谢。

最新喜欢:

wdy9927wdy992...
kezhu
驱动牛犊
驱动牛犊
  • 注册日期2003-07-16
  • 最后登录2004-05-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-29 13:11
犯了个错误,程序运行到SetupDiEnumDeviceInterfaces就已经有问题了,后面肯定过不去,GetLastError=259,ERROR_NO_MORE_ITEMS。

GUID可以从注册表中查到,也可以用SetupDiGetDeviceRegistryProperty得到。
kezhu
驱动牛犊
驱动牛犊
  • 注册日期2003-07-16
  • 最后登录2004-05-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-30 13:47
好像大家都遇到过SetupDiEnumDeviceInterfaces失败这个问题,并且都解决了,谁能具体说一下是怎么解决的呀?

抄了很多代码都不成功,我的环境是bcb6。
kezhu
驱动牛犊
驱动牛犊
  • 注册日期2003-07-16
  • 最后登录2004-05-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-01 13:18
帮帮我呀。
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-09-29 13:00
请问bcb下可以调试需要ddk的引用程序吗?
littlewangjie
驱动牛犊
驱动牛犊
  • 注册日期2003-10-20
  • 最后登录2003-10-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-23 06:26
应该是GUID的值不对
游客

返回顶部