![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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-нотификации ?