Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WM_DEVICECHANGE или как определить безопасное извлечение флэшки


ter ©   (2007-10-05 07:42:00) 

Собственно вопрос в том, что во время безопасного извлечения флехи, должно приходить сообщение с параметром DBT_DEVICEQUERYREMOVE, т.е. с запросом на разрешение, но, такое не приходит, а приходит сразу DBT_DEVICEREMOVECOMPLETE, т.е. уже поздно что либо делать.
Вот и проблема, каким образом можно узнать об отключении диска, и успеть до отключения, завершить работу с открытыми файлами на флехе.

procedure TMainForm.WMDeviceChange(var message: TMessage);
var DriveType: Cardinal;
 S: String;
begin
 case message.wParam of
   {DBT_DEVICEQUERYREMOVE}$8001: begin
     S := ExpandFileName(Application.ExeName);
     S := Copy(S,1,2);
     DriveType := GetDriveType(PChar(S));
     if DriveType in [DRIVE_UNKNOWN, DRIVE_NO_ROOT_DIR] then  begin
       actExit.Execute;
     end;
     message.Result := 1;
   end;
 end;
end;


  (2008-05-24 18:22:00) [1]

Удалено модератором


DiamondShark   (2008-05-23 18:53:00) [2]


> ter   (05.10.07 15:30) [14]
> а что да, как показывает практика, на мои вопросы, которых
> я задавал тут раз 5, ни разу не дали вразумительного ответа!

Ну так ты можешь нассать и утопиться, потому что больше тебе никто не будет даже пытаться отвечать, потому что ты жлоб и говно.


Alexey   (2008-05-17 18:41:00) [3]

ter, а нельзя было написать тут решение? Вот читаю ветку и думаю: молодец, ёпрст, как говориться "пытаться, искать, найти и перепрятать"!


Denis_   (2007-10-06 13:33:00) [4]


> т.к. в инете ... нерабочих примеров

Теперь точно пора удалять.


ter   (2007-10-05 15:57:00) [5]

я про него знал, а спрашивал пример использоания, т.к. в инете дохера нерабочих примеров


Riply   (2007-10-05 15:36:00) [6]

> [14] ter   (05.10.07 15:30)
> а что да, как показывает практика, на мои вопросы, которых я задавал тут раз 5,
> ни разу не дали вразумительного ответа!
> Может конечно вопросы слишком сложные :)

Да тольк прочтиав эту ветку видно, что люди пытались тебе помочь и помогали

> [2] ter   (05.10.07 10:22)
> нет, есть пример?


> [1] Сергей М. ©   (05.10.07 09:36)
> RegisterDeviceNotification вызывал для регистрации DBT_DEVICEQUERYREMOVE-
> нотификации ?

Ведь до этого ты был ни сном ни духом о RegisterDeviceNotification.
Уж не говоря о том, что если бы даже не смогли помочь, все равно
они тратили на тебя свое время.


ter   (2007-10-05 15:30:00) [7]

а что да, как показывает практика, на мои вопросы, которых я задавал тут раз 5, ни разу не дали вразумительного ответа!
Может конечно вопросы слишком сложные :)


Riply   (2007-10-05 15:16:00) [8]

> [12] ter   (05.10.07 14:50)
>!!!Модератор!!! удали тему, здесь всё равно никто не ответит,
>и к тому же, я уже сам нашел ответ :)

Нда...


ter   (2007-10-05 14:50:00) [9]

!!!Модератор!!! удали тему, здесь всё равно никто не ответит, и к тому же, я уже сам нашел ответ :)


ter   (2007-10-05 13:57:00) [10]

нет там ничего вразумительного


Сергей М.   (2007-10-05 13:49:00) [11]

В MSDN вроде бы был какой-то комментарий по поводу ситуаций, когда система не извещает об этом событии.


ter   (2007-10-05 13:18:00) [12]

Up


ter   (2007-10-05 11:19:00) [13]

никто не знает???


ter   (2007-10-05 10:45:00) [14]

смотрел, возвращает истину если удалось зарегистрировать обработчик.

Проблема в том, что все работает но не приходит запрос от системы на разрешение остановки съемного диска.
Система сообщает по факту о отключении диска, а мне нужно перед отключением совершить свою операцию.


Сергей М.   (2007-10-05 10:40:00) [15]

Что у тебя возвращает ф-ция USBRegister ?

Пример
http://msdn2.microsoft.com/en-us/library/aa363427.aspx
смотрел ?


ter   (2007-10-05 10:31:00) [16]

переделал так, результат тотже

type
PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
DEV_BROADCAST_HDR = packed record
  dbch_size: DWORD;
  dbch_devicetype: DWORD;
  dbch_reserved: DWORD;
end;

PDevBroadcastDeviceInterface  = ^DEV_BROADCAST_DEVICEINTERFACE;
DEV_BROADCAST_DEVICEINTERFACE = record
  dbcc_size: DWORD;
  dbcc_devicetype: DWORD;
  dbcc_reserved: DWORD;
  dbcc_classguid: TGUID;
  dbcc_name: short;
end;

const
GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';

function USBRegister: Boolean;
var
dbi: DEV_BROADCAST_DEVICEINTERFACE;
Size: Integer;
r: Pointer;
begin
Result := False;
Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
ZeroMemory(@dbi, Size);
dbi.dbcc_size := Size;
dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
dbi.dbcc_reserved := 0;
dbi.dbcc_classguid  := GUID_DEVINTERFACE_USB_DEVICE;
dbi.dbcc_name := 0;

r := RegisterDeviceNotification(MainForm.Handle, @dbi,
  DEVICE_NOTIFY_WINDOW_HANDLE
  );
if Assigned(r) then Result := True;
end;


ter   (2007-10-05 10:25:00) [17]

type
 TDEV_BROADCAST_HDR = record
   dbch_size: DWORD;
   dbch_devicetype: DWORD;
   dbch_reserved: DWORD;
 end;

var NotificationFilter: TDEV_BROADCAST_HDR;
begin
 NotificationFilter.dbch_size := sizeOf(NotificationFilter);
 NotificationFilter.dbch_devicetype := DBT_DEVTYP_VOLUME;
RegisterDeviceNotification(Handle,@NotificationFilter,DEVICE_NOTIFY_WINDOW_HANDL E);
end;

так делаю, не помогает, приходит сразу DBT_DEVICEREMOVECOMPLETE и всё тут


Сергей М.   (2007-10-05 10:22:00) [18]

Погугли.
Навалом примеров.


ter   (2007-10-05 10:22:00) [19]

нет, есть пример?


Сергей М.   (2007-10-05 09:36:00) [20]

RegisterDeviceNotification вызывал для регистрации DBT_DEVICEQUERYREMOVE-нотификации ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо