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

我有一个定制开发的USB读卡器。 我使用以下代码进行交互并对设备进行迭代:

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

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

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

但是,这种“弹出”方法会卸载整个驱动器,而不是简单地弹出介质卡。

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

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

我怎样才能在c#中推动这种不同类型的弹出?

谢谢,斯蒂芬妮

我是同一个任务。 🙂

您需要使用弹出可移动媒体。 请参阅此处的c ++示例: 如何弹出可移动媒体

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

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

  1. 如何在Windows中弹出可移动媒体中概述的步骤开始。
  2. 将调用替换为AutoEjectVolume ,其代码实际上是如何准备USB驱动器以进行安全删除RemoveDrive方法的主体。 请注意,此后续工作在很大程度上依赖于其他两篇CodeProject文章 – 包括您在问题中引用的文章 – 移植到C#。

在2中,我说“实际上”是因为 – 实际上 – 在两个解决方案中使用相同的hVolume ,在Microsoft解决方案中调用LockVolumeDismountVolumePrepareRemovalOfVolume 之前 ,在CodeProject RemoveDrive方法中执行所有检查更有意义, 然后调用CM_Request_Device_Eject_NoUi ,如CodeProject解决方案中所示。

一个简短的伪代码摘要:

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