Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.21;
Скачать: CL | DM;

Вниз

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

 
ter   (2007-10-05 07:42) [0]

Собственно вопрос в том, что во время безопасного извлечения флехи, должно приходить сообщение с параметром 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;


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

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


 
ter   (2007-10-05 10:22) [2]

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


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

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


 
ter   (2007-10-05 10:25) [4]

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 и всё тут


 
ter   (2007-10-05 10:31) [5]

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

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;


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

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

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


 
ter   (2007-10-05 10:45) [7]

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

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


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

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


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

Up


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

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


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

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


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

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


 
Riply ©   (2007-10-05 15:16) [13]

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

Нда...


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

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


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

> [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:57) [16]

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


 
Denis_ ©   (2007-10-06 13:33) [17]


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

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


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

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


 
DiamondShark ©   (2008-05-23 18:53) [19]


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

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


 
имя   (2008-05-24 18:22) [20]

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



Страницы: 1 вся ветка

Текущий архив: 2009.06.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
3-1222488895
девушка
2008-09-27 08:14
2009.06.21
Контроль непрерывности и непересечения интервала дат


2-1240914551
Pasha_777
2009-04-28 14:29
2009.06.21
Referrer и POST запрос.


9-1179168683
Pa5ha
2007-05-14 22:51
2009.06.21
Джойстик


11-1201874936
Татьяна
2008-02-01 17:08
2009.06.21
программирование для КПК со сканером


15-1239456757
{RASkov}
2009-04-11 17:32
2009.06.21
TIdFTP и Proxy