Проблема с наложением значков в Python - PullRequest
6 голосов
/ 23 января 2011

На этом форуме я нашел несколько примеров и тем о том, как реализовать обработчик наложения значков в 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 \ Расширения оболочки \ Утверждено 3 / непосредственно под корнем класса.

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

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

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

1 Ответ

0 голосов
/ 25 января 2011

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

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

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

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

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

...