Форум: "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.006 c