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

Вниз

Метки дисков   Найти похожие ветки 

 
Bartov   (2003-03-20 05:55) [0]

Hi, всем.
Возникла проблема.
Как можно узнать о том, что изменилась метка диска.
Есть ли какой-нибудь wm_xxx, с помощью которого можно отслеживать их изменения, а то через таймер не охото проверять.
Или как можно сделать это красиво?

Спасибо.


 
Bartov   (2003-03-20 14:35) [1]

Мда... Что-то все молчат ;-(


 
Игорь Шевченко ©   (2003-03-20 14:56) [2]

Молчат, потому что нету WM_xxxxx. Даже WM_DEVICECHANGE не пошлется. И среди Volume management functions нет никаких Notifications. А Device какой - removable или нет ? Потому как для Removable WM_DEVICECHANGE посылается при смене тома.


 
Bartov   (2003-03-20 15:48) [3]

> А Device какой - removable или нет ? Потому как для Removable WM_DEVICECHANGE посылается при смене тома.
Хочу винт отловить.
Не уж-то таймер вешать?...

> Даже WM_DEVICECHANGE не пошлется
На WM_DEVICECHANGE я повесил обновление списка с усройствами, если добавлено/удалено устройство (тип volome) и так же CD/DVD всунули/высунули - вот здесь метка и поменялась. ;-)
А вот и примерчик откуда брал:
http://delphikol.narod.ru/project_jedi/Dbt.zip


 
Игорь Шевченко ©   (2003-03-20 16:22) [4]

Bartov (20.03.03 15:48)

У винта таймер вешать. А как часто у винта метка тома меняется ?


 
Bartov   (2003-03-20 17:06) [5]

Не часто, спору нет.
Думаю интервал в 3 секунды будет достаточен.
Хотя Эксплорер как-то обрабатывает это изменение, если даже окно не активно, т.е. на заднем фоне.

Вот всем знакомая ф-ция получения метки тома, но вней два недостатка:

var
NotUsed: DWORD;
Buf: array [0..MAX_PATH - 1] of Char;
begin
Buf := #0;
GetVolumeInformation(PChar(Drv + "\\"), Buf, DWORD(SizeOf(Buf)), nil, NotUsed, NotUsed, nil, 0);
Result := Buf;
end;

1. Если сделать Drv + "\", то не всегда под Виндой 9х будет отображаться правильно, под XP все нормально.
2. Возращает Дос метку, т.е. не учитывает регистр букв.
Эту ф-цию реально использовать только для того, чтобы проверить есть ли на самом деле метка или нет, т.е. String <>"".

А вот варинат как получить Виндовую метку:

var
NotUsed: DWORD;
SFI: TShFileInfo;
begin
FillChar(SFI, SizeOf(SFI), 0);
ShGetFileInfo(PChar(Drv + "\"), 0, SFI, SizeOf(SFI), SHGFI_DISPLAYNAME);
Result := SFI.szDisplayName;

if Result = "" then //== Для Win9x, когда нет меток дисков
Result := "<none>"
else if Pos("(", Result) <> 0 then
SetLength(Result, Pos("(", Result) - 2);
end;

И работает на ура.


 
Игорь Шевченко ©   (2003-03-20 17:16) [6]


> Эксплорер как-то обрабатывает это изменение

Поищи по undocumented Shell, там весьма вероятно может быть, но оно сильно зависит от версии Shell32.dll


 
Bartov   (2003-03-21 07:43) [7]

Ладно, закрываю тему.
Если найду как лучше, то напишу...


 
Bartov   (2003-03-22 09:40) [8]

Из MSDN 2002
ms-help://MS.MSDNQTR.2002JUL.1033/devio/deviceman_9z77.htm

Смотри
GUID_IO_VOLUME_CHANGE - The volume label has changed.


 
Bartov   (2003-03-22 11:03) [9]

SetVolumeLabel - устанавливает ДОС метки, т.е. в верхнем регистре, а как тогда сделать чтоб было System, а не SYSTEM?



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

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

Наверх




Память: 0.48 MB
Время: 0.011 c
1-59656
Hacker.
2003-05-03 08:26
2003.05.19
Сохранение типов.


6-59837
userr
2003-03-22 21:11
2003.05.19
TCP-IP protocol


1-59802
bkv
2003-05-07 10:21
2003.05.19
Мастера, обьясните что такое Visibroker и с чем его едят?


14-59904
anton_cor
2003-04-29 20:33
2003.05.19
ExpressQuantumGrid Suite v4 - Master-Detail


1-59697
Novichek
2003-05-07 15:12
2003.05.19
перевод из Dec в Hex