Как программно получить и установить рейтинг файла
Как программно получить и установить рейтинг файла
Начиная с Windows Vista у пользователя появилась возможность ставить оценки некоторым файлам, например, фотографиям, музыкальным файлам и видеороликам. Оценка отображается при просмотре таблицы файлов в Проводнике в виде звездного рейтинга от 0 до 5. На мой взгляд, штука не особо нужная, но раз она присутствует в системе, то почему бы не научиться с ней работать? Как обычно, Ассемблер нам в этом поможет.
Поскольку здесь используются COM-объекты, нам понадобится некоторое количество структур, интерфейсов и констант для работы. Все как всегда, ничего необычного.
Code (Assembler) : Убрать нумерацию
- struct PROPVARIANT
- vt dw ?
- wReserved rw 3
- struct
- lVal dd ?
- ends
- decVal dd ?
- ends
- struct PROPKEY
- fmtid rb 16
- pid dd ?
- ends
- ; IID_IShellItem2 Interface
- struct IShellItem2
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IShellItem2
- BindToHandler dd ? ; 00Ch
- GetParent dd ? ; 010h
- GetDisplayName dd ? ; 014h
- GetAttributes dd ? ; 018h
- Compare dd ? ; 01Ch
- GetPropertyStore dd ? ; 020h
- GetPropertyStoreWithCreateObject dd ? ; 024h
- GetPropertyStoreForKeys dd ? ; 028h
- GetPropertyDescriptionList dd ? ; 02Ch
- Update dd ? ; 030h
- GetProperty dd ? ; 034h
- GetCLSID dd ? ; 038h
- GetFileTime dd ? ; 03Ch
- GetInt32 dd ? ; 040h
- GetString dd ? ; 044h
- GetUInt32 dd ? ; 048h
- GetUInt64 dd ? ; 04Ch
- GetBool dd ? ; 050h
- ends
- ; IID_IPropertyStore Interface
- struct IPropertyStore
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IPropertyStore
- GetCount dd ? ; 00Ch
- GetAt dd ? ; 010h
- GetValue dd ? ; 014h
- SetValue dd ? ; 018h
- Commit dd ? ; 01Ch
- ends
- ; GUID {7E9FB0D3-919F-4307-AB2E-9B1860310C93}
- IID_IShellItem2 \
- dd 07E9FB0D3h
- dw 0919Fh
- dw 04307h
- db 0ABh, 02Eh, 09Bh, 018h, 060h, 031h, 00Ch, 093h
- ; GUID {886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99}
- IID_IPropertyStore \
- dd 0886D8EEBh
- dw 08CF2h
- dw 04446h
- db 08Dh, 002h, 0CDh, 0BAh, 01Dh, 0BDh, 0CFh, 099h
- ; GUID {64440492-4C8B-11D1-8B70-080036B11A03}
- PKEY_Rating \
- dd 064440492h
- dw 04C8Bh
- dw 011D1h
- db 08Bh, 070h, 008h, 000h, 036h, 0B1h, 01Ah, 003h
- PKEY_Rating_pid = 9
- VT_UI4 = 19
- GPS_READWRITE = 2
Получив объект хранилища свойств файла, можно или получить нужное значение, или же установить его новое значение. В нашем случае это будет свойство PKEY_Rating. Начнем с получения текущего значения рейтинга файла.
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- ; Получить полный путь к файлу
- invoke GetFullPathName,fname,MAX_PATH,szPath,NULL
- or eax,eax
- jz loc_exit
- ; Создать структуру ITEMIDLIST
- invoke ILCreateFromPath,szPath
- or eax,eax
- jz loc_exit
- mov [pidlFile],eax
- ; Создать объект IShellItem2
- invoke SHCreateItemFromIDList,[pidlFile],IID_IShellItem2,pShItem
- or eax,eax
- jnz loc_exit
- ; Получить интерфейс IPropertyStore объекта
- mov eax,[pShItem]
- mov eax,[eax]
- stdcall dword [eax+IShellItem2.GetPropertyStore],[pShItem],\
- GPS_READWRITE,IID_IPropertyStore,pPropStore
- or eax,eax
- jnz loc_done2
- ; Заполнить структуру PROPKEY
- mov edi,prop.fmtid
- mov esi,PKEY_Rating
- movsd
- movsd
- movsd
- movsd
- mov [prop.pid],PKEY_Rating_pid
- ; Получить текущее значение рейтинга
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall [eax+IPropertyStore.GetValue],[pPropStore],prop,variant
- or eax,eax
- jnz loc_done1
- ; [variant.lVal] = значение рейтинга 0..99
- loc_done1:
- ; Прибраться за собой
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall [eax+IPropertyStore.Release],[pPropStore]
- loc_done2:
- mov eax,[pShItem]
- mov eax,[eax]
- stdcall [eax+IShellItem2.Release],[pShItem]
- loc_exit:
- ; Удалить объект
- invoke CoUninitialize
Для установки нового значения рейтинга надо воспользоваться методом SetValue объекта хранилища свойств. Новое значение должно быть в интервале 0..99, иначе метод вернет ошибку. Для каждого рейтинга диапазоны будут следующие: [0] = нет оценки, [1..12] = 1 звезда, [13..37] = 2 звезды, [38..62] = 3 звезды, [63..87] = 4 звезды, [88..99] = 5 звезд. Кроме того, при помощи ручного способа установки можно задавать произвольное значение из разрешенного диапазона, тогда как при изменении рейтинга через Проводник будет установлено фиксированное значение 0, 1, 25, 50, 75 или 99 соответственно. Код установки рейтинга файла будет следующим:
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- ; Получить полный путь к файлу
- invoke GetFullPathName,fname,MAX_PATH,szPath,NULL
- or eax,eax
- jz loc_exit
- ; Создать структуру ITEMIDLIST
- invoke ILCreateFromPath,szPath
- or eax,eax
- jz loc_exit
- mov [pidlFile],eax
- ; Создать объект IShellItem2
- invoke SHCreateItemFromIDList,[pidlFile],IID_IShellItem2,pShItem
- or eax,eax
- jnz loc_exit
- ; Получить интерфейс IPropertyStore объекта
- mov eax,[pShItem]
- mov eax,[eax]
- stdcall dword [eax+IShellItem2.GetPropertyStore],[pShItem],\
- GPS_READWRITE,IID_IPropertyStore,pPropStore
- or eax,eax
- jnz loc_done2
- ; Заполнить структуру PROPKEY
- mov edi,prop.fmtid
- mov esi,PKEY_Rating
- movsd
- movsd
- movsd
- movsd
- mov [prop.pid],PKEY_Rating_pid
- ; Новое значение рейтинга 0..99
- mov [variant.vt],VT_UI4
- mov [variant.lVal],67 ; <- значение
- ; Установить новое значение рейтинга
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall [eax+IPropertyStore.SetValue],[pPropStore],prop,variant
- or eax,eax
- jnz loc_done1
- ; Применить изменения
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall [eax+IPropertyStore.Commit],[pPropStore]
- or eax,eax
- jnz loc_done1
- ; Новое значение рейтинга успешно установлено
- loc_done1:
- ; Прибраться за собой
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall [eax+IPropertyStore.Release],[pPropStore]
- loc_done2:
- mov eax,[pShItem]
- mov eax,[eax]
- stdcall [eax+IShellItem2.Release],[pShItem]
- loc_exit:
- ; Удалить объект
- invoke CoUninitialize
Рейтинг файла в Проводнике
В приложении примеры программ с исходными текстами, одна из которых устанавливает рейтинг тестовому файлу, а вторая его получает.
Просмотров: 428 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария