Как получить миниатюру файла из кеша Windows через Python?Python

Программы на Python
Ответить
Anonymous
 Как получить миниатюру файла из кеша Windows через Python?

Сообщение Anonymous »

Цель — получить миниатюры файлов из выбранной папки в Windows за минимально возможное время.
Imagemagick и другие инструменты открывают файлы каждый раз, поэтому они могут быть не самыми эффективными. . Встроенный механизм в Windows позволяет сохранять миниатюры в кеше, что теоретически дает значительный прирост скорости.
Из Как получить миниатюру файла с помощью Windows API? (ответ) про способы стало понятно, но было много проблем:
  • IThumbnailProvider и IThumbnailCache не найдены в:
    • ctypes.windll.shell32 (есть только функции, и кажется, что нет простого способа получить интерфейсы)
    • win32com.shell.shell (PyWin32)< /li>
  • IID_IThumbnailProvider и IShellItemImageFactory через SHCreateItemFromParsingName и IID:
    • Этот IID не найден в win32com.shell.shell, поэтому они были предоставлены вручную.
    • IThumbnailProvider, Метод IShellItem::BindToHandler: исправлено, но теперь ошибка такая же, как показано ниже:

      Код: Выделить всё

      # str(shell.IID_IShellItem) == '{43826D1E-E718-42EE-BC55-A1E261C37BFE}'
      # str(shell.BHID_ThumbnailHandler) == '{7B2E650A-8E20-4F4A-B09E-6597AFC72FB0}'
      
      item = shell.SHCreateItemFromParsingName(r'd:\some.png', None, str(shell.IID_IShellItem))  # str() is works
      IID_IThumbnailProvider = '{e357fccd-a995-4576-b01f-234630154e96}'
      provider = item.BindToHandler(None, shell.BHID_ThumbnailHandler, IID_IThumbnailProvider)  # error
      
      > TypeError: 'There is no interface object registered that supports this IID'
      
    • IShellItemImageFactory: подозреваю, что IID используется неправильно, но из ответа ниже это должно работать:

      Код: Выделить всё

      IID_IShellItemImageFactory = '{bcc18b79-ba16-442f-80c4-8a59c30c463b}'
      item = shell.SHCreateItemFromParsingName(r'd:\some.png', None, IID_IShellItemImageFactory)  # error
      
      > TypeError: 'There is no interface object registered that supports this IID'
      
Было бы здорово понять, как плавать во всем этом, не изучая весь винапи..
Заранее спасибо.
Windows 10 (20H2), Python 3.9.5, PyWin32 301

Обновление: найден ответ о PyWin32 (pythoncom.CoCreateInstance не может создать IZoneIdentifier; интерфейс также отсутствует в реестре, несмотря на то, что он задокументирован в MSDN). Короче говоря, эти интерфейсы не реализованы. Проверил:

Код: Выделить всё

> import pythoncom
> pythoncom.InterfaceNames
Итак.. осталось 2 вопроса. Есть ли варианты получить миниатюры без использования PyWin32? Например, через ctypes. И как?

Подробнее здесь: https://stackoverflow.com/questions/679 ... ugh-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»