从读卡器C#中弹出存储卡

时间:2010-10-21 16:44:55

标签: c# usb

我有一个定制开发的USB读卡器。我正在使用以下代码与设备进行交互和iterrate:

http://www.codeproject.com/KB/system/usbeject.aspx

上面的代码使用以下行提供'eject'方法:

Native.CM_Request_Device_Eject_NoUi(device.InstanceHandle, IntPtr.Zero, null, 0, 0);

然而,这种'弹出'方法卸载整个驱动器,而不是简单地弹出媒体卡。

为什么这是一个问题是因为我想'弹出'媒体卡,然后放入另一个。然而,当整个阅读器被弹出时,我必须拔出/重新插入设备才能显示备份。

在Windows资源管理器中,当我右键单击“弹出”时,它按照我想象的方式运行,它可以安全地移除存储卡但不能读取读卡器。

如何在c#中实现这种不同类型的弹出?

2 个答案:

答案 0 :(得分:1)

我是同一个任务。 :)

您需要使用弹出可移动媒体。 请参阅此处的c ++示例:How To Ejecting Removable Media

答案 1 :(得分:1)

我在搜索“CM_Request_Device_Eject_NoUi”时意外地来到这里,看到它类似于我最近通过将类似的解决方案组合在一起所做的解决方案。原谅迟到的答案。

这对我有用(这也解决了我在其他SO问题上看到的一些问题,这些问题来自Microsoft示例,而不是“在使用操作系统安全删除硬件时系统执行的所有操作”) :

  1. How to Eject Removable Media in Windows
  2. 中列出的步骤开始
  3. 将来自AutoEjectVolume的调用替换为实际上AutoEjectVolume方法的正文代码How to Prepare a USB Drive for Safe Removal。请注意,此后期工作在很大程度上依赖于其他两篇CodeProject文章 - 包括您在问题中引用的文章 - 移植到C#。
  4. 在2中,我说“实际上”是因为 - 实际上 - 在两个解决方案中使用相同的RemoveDrive,并且在CodeProject hVolume方法中执行所有检查更有意义em>之前在Microsoft解决方案中调用RemoveDriveLockVolumeDismountVolume然后调用PrepareRemovalOfVolume,如下所示CodeProject解决方案。

    简短的伪代码摘要:

    • 使用CM_Request_Device_Eject_NoUi(CodeProject)
    • 打开卷
    • 获取驱动器的设备实例句柄和驱动器的父设备 实例句柄(CodeProject)
    • 在致电前退出 - 特别是 - CreateFile, 如果上述任何步骤失败(CodeProject)
    • 致电DismountVolumeLockVolumeDismountVolume 使用从PrepareRemovalOfVolume(Microsoft)
    • 返回的hVolume
    • 您可以在此
    • 后随时关闭CreateFile
    • 在驱动器的父设备上调用hVolume 实例句柄(CodeProject)