Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#31: 2007-09-12 17:54:58 ЛС | профиль | цитата
Chesh, там специфичного для C кода почи ничего нет, ибо всё построено на API-вызовах. Если нужны будут библиотеки - пиши, отошлю.
карма: 1

0
Ответов: 574
Рейтинг: 1
#32: 2008-07-01 20:42:29 ЛС | профиль | цитата
iarspider писал(а):
Unplug - это для всех (т.е. со сменныи и несменным носителем). При этом происходит логическое отключение устройства.


Ребята, привет! Я немножко отсутствовал, может что пропустил. Такой метод извлечения никто так и не сделал? Очень понадобилось
------------ Дoбавленo:

Если что, нашёл тут кое-какую статейку на русском, но опять-таки для C++. Может пригодится... http://expert.delphi.int.ru/question/260/
карма: 0

0
Ответов: 3851
Рейтинг: 159
#33: 2008-07-01 20:49:53 ЛС | профиль | цитата
дарова.
что-то ты долго .. отсутствовал
с некоторого времени у нас в текущей версии есть элемент FSMonitor, вот он и 'Производит отключение переносных дисков'. Или ты о другом?
карма: 0
начавший
0
Ответов: 574
Рейтинг: 1
#34: 2008-07-01 21:00:11 ЛС | профиль | цитата
Привет, Андрей! Только что посмотрел с SVN компонент - у меня тот же (в HiAsm), метод извлечения Unplug не реализован (только что попытался свою USB-флешку извлечь - она осталась в качестве буквы диска в моём компьютере и в неё нельзя зайти - это извлечение для кард-ридеров). Вот такие дела...
------------ Дoбавленo:

Как бы намекнуть, чтобы nesco помог
карма: 0

0
Ответов: 3851
Рейтинг: 159
#35: 2008-07-01 21:18:50 ЛС | профиль | цитата
Я тоже не совсем понял как оно code_9373.txt работает..

карма: 0
начавший
0
файлы: 1code_9373.txt [1KB] [484]
Ответов: 574
Рейтинг: 1
#36: 2008-07-01 21:57:58 ЛС | профиль | цитата
Андрей. писал(а):
Я тоже не совсем понял как оно code_9373.txt работает..


Тебе это нужно?


#sha
Add(MainForm,4409206,28,35)
{
Left=20
Top=105
}
Add(Button,14410281,133,112)
{
Left=120
Top=135
Width=155
Caption="Отключить диск"
link(onClick,4427666:doDeviceRemove,[])
}
Add(FSMonitor,4427666,189,112)
{
link(Drive,15917525:Disk,[])
}
Add(DriveBox,15917525,189,56)
{
Left=120
Top=110
Width=155
Height=21
}
------------ Дoбавленo:

Вот что-то для Delphi нарыл. Поможет?

http://pblog.ru/?p=105
карма: 0

0
файлы: 1code_9374.txt [354B] [610]
Разработчик
Ответов: 26069
Рейтинг: 2121
#37: 2008-07-01 22:02:16 ЛС | профиль | цитата
Yuriy, я посмотрю немного позже, возможно пригодится
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#38: 2008-07-01 23:20:59 ЛС | профиль | цитата
Yuriy писал(а):
Вот что-то для Delphi нарыл
так там же в zip-е есть готовый exe-файл. Что тебе еще нужно?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26069
Рейтинг: 2121
#39: 2008-07-01 23:23:00 ЛС | профиль | цитата
Tad писал(а):
Что тебе еще нужно?

Наверное, компонент для HiAsm'a
карма: 22

0
Ответов: 3851
Рейтинг: 159
#40: 2008-07-01 23:43:03 ЛС | профиль | цитата
Yuriy писал(а):
Тебе это нужно?
Да мне пока не нужно, просто - мысли вслух.
Думал, что готовность системы "отпустить" диск, после вызова соответствующих методов компонент, должна сопровождаться сообщением как при штатных действиях юзера..
карма: 0
начавший
0
Ответов: 574
Рейтинг: 1
#41: 2008-07-02 03:29:24 ЛС | профиль | цитата
nesco писал(а):
Yuriy, я посмотрю немного позже, возможно пригодится


Большое тебе спасибо!!!

Tad писал(а):
так там же в zip-е есть готовый exe-файл. Что тебе еще нужно?


Я вроде в HiAsm пока проект делаю, не в Delphi, как заметил nesco ;)
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#42: 2008-07-02 18:11:43 ЛС | профиль | цитата
Yuriy, а что мешает запустить внешнюю програму из HiAsm ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26069
Рейтинг: 2121
#43: 2008-07-02 18:57:59 ЛС | профиль | цитата
Tad писал(а):
а что мешает запустить внешнюю програму из HiAsm ?

Ему это не понравилось
карма: 22

0
Ответов: 574
Рейтинг: 1
#44: 2008-07-02 21:42:00 ЛС | профиль | цитата
Я смотрю, мне можно молчать
карма: 0

0
Разработчик
Ответов: 26069
Рейтинг: 2121
#45: 2008-07-02 22:00:59 ЛС | профиль | цитата
Да я припоминаю твои изыскания в этой области

Задал ты оригинальную задачу, просто так она не решается. Удаляется устройство не сложно, сложно получить хандл этого устройства по букве диска -- вот там такая @па, что я уже какой час над этим бьюсь

------------ Дoбавленo:


Для тех, кому интересно:

Формально для безопасного извлечения USB-накопителя достаточно сделать вызов CM_Query_And_Remove_SubTree() для родительского экземпляра устройства (Device Instance) нужного диска.
Однако проблема получения кода экземпляра устройства по букве диска достаточно нетривиальна.

Один из вариантов решения:
1) получить номер устройства в своём классе по имени устройства:
DeviceIoControl() c кодом операции IOCTL_STORAGE_GET_DEVICE_NUMBER для хэндла,
полученного с помощью CreateFile('\\.\X:', .... ) (где X - имя нужного диска)
Запомним найденный номер, например, в DeviceNumber.

2) Далее, путём перебора всех устройств в классе GUID_DEVINTERFACE_DISK (в случае USB-Flash), определяем номер устройства по имени:
DeviceIoControl() c кодом операции 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.


------------ Дoбавленo:


Вроде ничего сложного, но получить вот это

Path - SP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath

таааакой геморрой...
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)