Извлечь карту памяти из устройства чтения карт памяти C # - PullRequest
1 голос
/ 21 октября 2010

У меня есть специально разработанный 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 ]

1 голос
/ 19 марта 2015

Я пришел сюда случайно, выполняя поиск по «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)
1 голос
/ 06 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...