Експертна система Delphi.int.ru

Общност на програмисти
Комуникация, помощ, обмен на опит

Експерт от Delphi.int.ru

Други раздели на портала

Отидете на въпрос:

Статистика за днес:

Въпроси: 0
Отговори: 0
Мини-форуми: 0

Топ експерти

Uv. експерти за това как да извлечете програмно (безопасно премахване на устройства) флаш памет?

Отговор №1. Експертни отговори: Александър А. Грибанов

Формално, за да премахнете безопасно USB устройството, просто се обадете на CM_Query_And_Remove_SubTree () за екземпляра на родителското устройство (Device Instance) на необходимия диск.
Проблемът с получаването на кода на екземпляра на устройството обаче с буква на устройство е доста нетривиален.

Едно от решенията:
1) вземете номера на устройството в неговия клас по името на устройството:
DeviceIoControl () с кода за опция IOCTL_STORAGE_GET_DEVICE_NUMBER за дръжката,
получено със CreateFile ('\\. \ X:',.) (където X е името на желаното устройство)

Нека си спомним намерения номер, например в DeviceNumber.

2) След това, като изброим всички устройства в класа GUID_DEVINTERFACE_DISK (в случай на USB-Flash), определяме номера на устройството по име:
DeviceIoControl () с операционния код IOCTL_STORAGE_GET_DEVICE_NUMBER за манипулатора, получен с помощта на CreateFile (Path,.)
(където Path е SP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath, който SetupDiGetDeviceInterfaceDetail () връща)
Ако полученият номер съвпадна с DeviceNumber (от т. 1), тогава намереното устройство е това, от което се нуждаем - помним кода на екземпляра в DeviceInstance (SP_DEVINFO_DATA.DevInst, който връща SetupDiGetDeviceInterfaceDetail ())
За итерация използвайте SetupDiGetClassDevs (), SetupDiEnumDeviceInterfaces ().

Сега, след като DeviceInstance е налице, получаваме кода на инстанцията на родителското устройство, използвайки CM_Get_Parent (DevInstParent, DeviceInstance) и изпълняваме CM_Query_And_Remove_SubTree () за DevInstParent.

Всичко - USB флаш устройството може да бъде премахнато.

P.S.: Интерфейсите към споменатите функции не са включени в дистрибуцията на Delphi, така че MSDN (или setupapi.h и cfgmgr32.h от DDK) е в ръка и.

Мини форум с въпроси