Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.005 c
15-1239973429
12
2009-04-17 17:03
2009.06.21
Сколько в tMemo можно сунуть информации?


2-1241083839
LDV
2009-04-30 13:30
2009.06.21
Вставка из Clipboard


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


13-1120595885
vveird
2005-07-06 00:38
2009.06.21
Технология .NET


2-1241207260
бульдозер
2009-05-01 23:47
2009.06.21
CreateProcess определить готовность запускаемого приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский