![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Метки дисков
Bartov © (2003-03-20 05:55:00)Hi, всем.
Возникла проблема.
Как можно узнать о том, что изменилась метка диска.
Есть ли какой-нибудь wm_xxx, с помощью которого можно отслеживать их изменения, а то через таймер не охото проверять.
Или как можно сделать это красиво?
Спасибо.
Bartov (2003-03-22 11:03:00) [1]SetVolumeLabel - устанавливает ДОС метки, т.е. в верхнем регистре, а как тогда сделать чтоб было System, а не SYSTEM?
Bartov (2003-03-22 09:40:00) [2]Из MSDN 2002
ms-help://MS.MSDNQTR.2002JUL.1033/devio/deviceman_9z77.htm
Смотри
GUID_IO_VOLUME_CHANGE - The volume label has changed.
Bartov (2003-03-21 07:43:00) [3]Ладно, закрываю тему.
Если найду как лучше, то напишу...
Игорь Шевченко (2003-03-20 17:16:00) [4]
> Эксплорер как-то обрабатывает это изменение
Поищи по undocumented Shell, там весьма вероятно может быть, но оно сильно зависит от версии Shell32.dll
Bartov (2003-03-20 17:06:00) [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 16:22:00) [6]Bartov (20.03.03 15:48)
У винта таймер вешать. А как часто у винта метка тома меняется ?
Bartov (2003-03-20 15:48:00) [7]> А Device какой - removable или нет ? Потому как для Removable WM_DEVICECHANGE посылается при смене тома.
Хочу винт отловить.
Не уж-то таймер вешать?...
> Даже WM_DEVICECHANGE не пошлется
На WM_DEVICECHANGE я повесил обновление списка с усройствами, если добавлено/удалено устройство (тип volome) и так же CD/DVD всунули/высунули - вот здесь метка и поменялась. ;-)
А вот и примерчик откуда брал:
http://delphikol.narod.ru/project_jedi/Dbt.zip
Игорь Шевченко (2003-03-20 14:56:00) [8]Молчат, потому что нету WM_xxxxx. Даже WM_DEVICECHANGE не пошлется. И среди Volume management functions нет никаких Notifications. А Device какой - removable или нет ? Потому как для Removable WM_DEVICECHANGE посылается при смене тома.
Bartov (2003-03-20 14:35:00) [9]Мда... Что-то все молчат ;-(