Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2019, 11:27   #1
WildDIC
Новичок
Джуниор
 
Регистрация: 13.03.2019
Сообщений: 1
По умолчанию Проблема с Windows Icon Overlay в 64-битной Windows

Доброго времени суток!
Столкнулся с проблемой, которую никак не получается победить.
Под 64-битной Windows 7 не работает Windows Icon Overlay, но под 32-битной Windows 7 все работает замечательно.

Код из примера простой. Выводит иконку для папок в c:\Python27\Lib\
Код:
import os
from win32com.shell import shell, shellcon
import winerror

class IconOverlay:

  _reg_clsid_ = '{3f9b50d1-43c1-11e4-9224-e0cb4e24e4ef}'
  _reg_progid_ = 'TJG.PythonPackagesOverlayHandler'
  _reg_desc_ = 'Icon Overlay Handler to indicate Python packages'
  _public_methods_ = ['GetOverlayInfo', 'GetPriority', 'IsMemberOf']
  _com_interfaces_ = [shell.IID_IShellIconOverlayIdentifier]

  def GetOverlayInfo(self):
    return (r'e:\Data\ppf.ico', 0, shellcon.ISIOI_ICONFILE)

  def GetPriority(self):
    return 50

  def IsMemberOf(self, fname, attributes):
    if os.path.exists (os.path.join (fname, "__init__.py")):
        return winerror.S_OK
    return winerror.E_FAIL

if __name__=='__main__':
  import win32api
  import win32con
  import win32com.server.register

  win32com.server.register.UseCommandLine (IconOverlay)
  keyname = r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\PyPackageOverlay'
  key = win32api.RegCreateKey (win32con.HKEY_LOCAL_MACHINE, keyname)
  win32api.RegSetValue (key, None, win32con.REG_SZ, IconOverlay._reg_clsid_)
В процессе поисков решения нашел другой вариант кода, который вроде бы расчитан и на 64-битные версии.

Код:
import os
import platform
import win32gui
import win32con
import winerror
import pythoncom
from win32com.shell import shell, shellcon

REG_PATH = r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers'
MACHINE_64_BIT = True if platform.machine() == "AMD64" else False

class TestClass:
    _reg_clsid_ = '{4FC554DF-F0EE-4A4F-966C-9C49CCF14D59}'
    _reg_progid_ = 'TJG.PythonPackagesOverlayHandler'
    _reg_desc_ = 'Icon Overlay Handler'
    _public_methods_ = ['GetOverlayInfo', 'GetPriority', 'IsMemberOf']
    _com_interfaces_ = [shell.IID_IShellIconOverlayIdentifier]

    def GetOverlayInfo(self):
        return (r'e:\Data\ppf.ico', 0, shellcon.ISIOI_ICONFILE)

    def GetPriority(self):
        return 50

    def IsMemberOf(self, fpath, attributes):
        if os.path.exists(os.path.join(fpath, "__init__.py")):
            return winerror.S_OK
        return winerror.E_FAIL

classes = [TestClass]

def DllRegisterServer():
    print "Registering %s" % REG_PATH
    import _winreg
    if MACHINE_64_BIT:
        for access in [_winreg.KEY_WOW64_64KEY, _winreg.KEY_WOW64_32KEY]:
            key = _winreg.CreateKeyEx(_winreg.HKEY_LOCAL_MACHINE, REG_PATH, 0, _winreg.KEY_ALL_ACCESS | access)
            for cls in classes:
                subkey = _winreg.CreateKeyEx(key, cls._reg_progid_, 0, _winreg.KEY_ALL_ACCESS | _winreg.KEY_WOW64_64KEY)
                _winreg.SetValueEx(subkey, None, 0, _winreg.REG_SZ, cls._reg_clsid_)
        print "Registration complete on 64 bit Machine: %s" % cls._reg_desc_
    else:
        key = _winreg.CreateKey(_winreg.HKEY_LOCAL_MACHINE, REG_PATH)
        for cls in classes:
            subkey = _winreg.CreateKey(key, cls._reg_progid_)
            _winreg.SetValueEx(subkey, None, 0, _winreg.REG_SZ, cls._reg_clsid_)
        print "Registration complete: %s" % cls._reg_desc_


def DllUnregisterServer():
    print "Unregistering %s" % REG_PATH
    import _winreg
    if MACHINE_64_BIT:
        for cls in classes:
            for access in [_winreg.KEY_WOW64_64KEY, _winreg.KEY_WOW64_32KEY]:
                try:
                    key = _winreg.DeleteKeyEx(_winreg.HKEY_LOCAL_MACHINE, r"%s\%s" % (REG_PATH, cls._reg_progid_),
                                              _winreg.KEY_ALL_ACCESS | access)
                except WindowsError, details:
                    import errno
                    if details.errno != errno.ENOENT:
                        raise
        print "Unregistration complete on 64 bit machine: %s" % cls._reg_desc_
    else:
        for cls in classes:
            try:
                key = _winreg.DeleteKey(_winreg.HKEY_LOCAL_MACHINE, r"%s\%s" % (REG_PATH, cls._reg_progid_))
            except WindowsError, details:
                import errno
                if details.errno != errno.ENOENT:
                    raise
        print "Unregistration complete: %s" % cls._reg_desc_


if __name__ == '__main__':
    from win32com.server import register

    register.UseCommandLine(*classes,
                            finalize_register=DllRegisterServer,
                            finalize_unregister=DllUnregisterServer)
Со вторым примером такая же ситуация - работает под 32-битной версией и никакой реакции в 64-битной Windows.

Кто-то может объяснить, в чем проблема?

Пробовал Python версий 2.7 и 3.7 и разрядностью 32 и 64 бита.
Там, где работает установлен только Python 2.7 32-разрядный.

На картинке - как это примерно выглядит, когда работает
Оба варианта скрипта и иконка - во вложении.
Изображения
Тип файла: png Clipboard01.png (44.4 Кб, 122 просмотров)
Вложения
Тип файла: zip IconOverlay.zip (9.3 Кб, 10 просмотров)
WildDIC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка Windows 8 вместо Windows 7 на ноутбук acer intel core i5 шохрухсайдалиев Windows 10 26.11.2013 18:48
После установки windows xp 32- битной нельзя установить windows 7 64-битную Mag84 Windows 3 03.12.2012 15:50
Собираюсь перейти с Windows на Linux, какой из дистирибутивов наиболее похож на Windows (Xp,7)? ivan.tiran Windows 5 09.03.2012 17:51
Проект (работа с БД) на Delphi XE2 на Windows 7 64. Будет ли эта программа корректно работать на Windows 7 32 ? Dux Общие вопросы Delphi 10 04.10.2011 19:33
Windows7,не работает HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows NT\CurrentVersion\Windows\AppInit_D LLs ассемблер123 Windows 0 22.04.2010 18:30