Извлечь карту памяти из устройства чтения карт памяти 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 не "делать все", что делает система, когда вы безопасно извлекаете оборудование с помощью ОС):
- Начните с действий, описанных в разделе Как извлечь съемный носитель в Windows.
- Заменить звонок на
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)