Проблема с перекрытием значков с Python

Я нашел несколько примеров и тем на этом форуме о том, как реализовать обработчик наложения значков с помощью Python 2.7 и пакета win32com, но он не работает для меня, и я не понимаю, почему.

Я создаю DLL, и у меня нет ошибки при регистрации. Я также пробовал прямо со сценарием, но это то же самое. Это похоже на то, что класс никогда не называется.

Вот код:

import win32traceutil from win32com.shell import shell, shellcon import pythoncom import winerror import os REG_PATH =r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers' REG_KEY = "GdIconOverlayTest" class GdClass: _reg_clsid_='{512AE200-F075-41E6-97DD-48ECA4311F2E}' _reg_progid_='GD.TestServer' _reg_desc_='gd desc' _public_methods_ = ['GetOverlayInfo','GetPriority','IsMemberOf'] _com_interfaces_=[shell.IID_IShellIconOverlayIdentifier, pythoncom.IID_IDispatch] def __init__(self): pass def GetOverlayInfo(self): return (os.path.abspath(r'C:\icons\test.ico'), 0, shellcon.ISIOI_ICONFILE) def GetPriority(self): return 0 def IsMemberOf(self, fname, attributes): print('ismemberOf', fname, os.path.basename(fname)) if os.path.basename(fname) == "hello.text": return winerror.S_OK return winerror.E_FAIL def DllRegisterServer(): print "Registering %s" % REG_KEY import _winreg key = _winreg.CreateKey(_winreg.HKEY_LOCAL_MACHINE, REG_PATH) subkey = _winreg.CreateKey(key, GdClass._reg_progid_) _winreg.SetValueEx(subkey, None, 0, _winreg.REG_SZ, GdClass._reg_clsid_) print "Registration complete: %s" % GdClass._reg_desc_ def DllUnregisterServer(): print "Unregistering %s" % REG_KEY import _winreg try: key = _winreg.DeleteKey(_winreg.HKEY_LOCAL_MACHINE, r"%s\%s" % (REG_PATH, GdClass._reg_progid_)) except WindowsError, details: import errno if details.errno != errno.ENOENT: raise print "Unregistration complete: %s" % GdClass._reg_desc_ if __name__=='__main__': from win32com.server import register register.UseCommandLine(GdClass, finalize_register = DllRegisterServer, finalize_unregister = DllUnregisterServer) 

Привет и спасибо за ваш ответ. Я тестировал файл журнала, а также win32traceutil. Регистрируются сообщения о регистрации / нерегистрации. Записи реестра также создаются в соответствии с:

1 / HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ShellIconOverlayIdentifiers \ GD.TestServer 2 / HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Shell Extensions \ Approved 3 / непосредственно под классом root.

Я также добавил некоторые журналы внутри методов getOverlayInfo, GetPriority и isMemberOf, но я не вижу трассировки при просмотре проводника.

Моя конфигурация: Python 2.7 pywin32-214.win32-py2.7.exe Windows XP SP 2

Вы можете скачать весь код здесь :

задача решена. Я предполагаю, что что-то было плохо инициализировано, но теперь оно работает.

Я хочу сделать что-то вроде сервиса dropBox.

я должен иметь возможность обновлять значок данного файла в соответствии с его статусом загрузки. Я создам класс для каждого состояния (загрузка, загрузка, провал), который будет реализовывать интерфейс IID_IShellIconOverlayIdentifier. Но потом…

должен ли я написать список файлов, которые в настоящее время загружаются / failed_to_upload в локальных файлах, проверить наличие каждого файла в методе isMemberOf, чтобы определить хороший значок для отображения? Это лучший способ сделать это, или было бы лучше, например, сохранить весь путь к файлу внутри ключа в реестре?

Спасибо за вашу помощь.