Извлечь карту памяти из устройства чтения карт памяти C#

У меня есть специально разработанный USB-картридер. Я использую следующий код для взаимодействия и прохождения через устройство:

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

Приведенный выше код предоставляет метод "извлечения" с использованием следующей строки:

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

Однако этот метод "извлечения" отключает весь диск вместо простого извлечения карты памяти.

Почему это проблема, потому что я хочу "извлечь" медиа-карту, а затем вставить другую. Однако, когда весь читатель извлекается, я должен отключить / снова подключить устройство, чтобы оно снова появилось.

В проводнике Windows, когда я щелкаю правой кнопкой мыши "извлечь", он работает так, как я себе представляю, где он безопасно удаляет карту памяти, но не считыватель карт.

Как я могу заставить этот другой тип выброса в C#?

Спасибо Стефани

2 ответа

Решение

У меня та же задача.:)

Вам нужно использовать извлекаемые сменные носители. Смотрите пример C++ здесь: Как извлечь съемный носитель

Я пришел сюда случайно, когда выполнял поиск по "CM_Request_Device_Eject_NoUi", и увидел, что это было похоже на решение, которое я недавно сделал, собрав воедино похожие части решения. Простите за поздние ответы.

Вот что сработало для меня (это также решает некоторые проблемы, которые я видел по другим вопросам SO, касающимся AutoEjectVolume из примера Microsoft не "делать все", что делает система, когда вы безопасно извлекаете оборудование с помощью ОС):

  1. Начните с действий, описанных в разделе Как извлечь съемный носитель в Windows.
  2. Заменить звонок на AutoEjectVolume с кодом, который, по сути, является телом RemoveDrive метод из Как подготовить USB-накопитель для безопасного удаления. Обратите внимание, что эта более поздняя работа в значительной степени опирается на две другие статьи CodeProject - включая ту, на которую вы ссылались в вашем вопросе - перенесена в C#.

Во 2 я говорю "в действительности", потому что - на практике - вы используете то же самое hVolume в обоих решениях, и имеет больше смысла делать все проверки в CodeProject RemoveDrive метод перед вызовом LockVolume, DismountVolume, или же PrepareRemovalOfVolume в решении Microsoft, а затем позвоните CM_Request_Device_Eject_NoUi как показано в решении CodeProject.

Краткое описание псевдокода:

  • Откройте том с помощью CreateFile (CodeProject)
  • Получить дескриптор экземпляра устройства диска и дескриптор экземпляра устройства родителя диска (CodeProject)
  • Выйти перед звонком - в частности - DismountVolume, если какой-либо из вышеперечисленных шагов завершится неудачей (CodeProject)
  • Вызов LockVolume, DismountVolume, а также PrepareRemovalOfVolumeс использованием hVolume вернулся из CreateFile (Microsoft)
  • Вы можете закрыть hVolume в любое время после этого
  • Вызов CM_Request_Device_Eject_NoUi на устройстве родителя диска
    дескриптор экземпляра (CodeProject)
Другие вопросы по тегам