2011-01-23 27 views
6

Encontré algunos ejemplos y temas en este foro sobre la forma de implementar un controlador de superposición de iconos con Python 2.7 & el paquete win32com pero no funciona para mí y no entiendo por qué.Problema de superposición de iconos con Python

Creo la DLL y no tengo ningún error cuando la registro. También he intentado directamente con el script, pero es lo mismo. Es como que nunca se llama a la clase.

Aquí está el código:

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) 

Hola y gracias por su respuesta. He probado con un archivo de registro y también win32traceutil. Los mensajes de registro/desregistro se registran. Las entradas del registro también se crean en:

1/HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ShellIconOverlayIdentifiers \ GD.TestServer 2/HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Shell Extensiones \ Aprobado 3/directamente debajo de la raíz de la clase.

También he agregado algunos registros dentro de los métodos getOverlayInfo, GetPriority y isMemberOf pero no puedo ver un rastro cuando navego por el explorador.

Mi configuración es: Python 2.7 pywin32-214.win32-py2.7.exe Windows XP SP 2

Puede descargar todo el código here:

+0

Escriba las entradas en un archivo de registro para ver qué funciones se llaman realmente (si es que las hay). Las llamadas a 'DllRegisterServer' son especialmente interesantes aquí. – AndiDog

+1

¡El enlace al código está roto! – mtasic85

Respuesta

0

problema resuelto. Supongo que algo se inicializó mal pero ahora funciona.

Mi deseo es hacer algo como el servicio dropBox.

necesito ser capaz de actualizar el icono de un archivo dado según su estado de carga. Crearé una clase para cada estado (carga, carga, falla) que implementará la interfaz IID_IShellIconOverlayIdentifier. Pero entonces ...

¿debo escribir la lista de archivos que están cargando actualmente/failed_to_upload en archivos locales? Compruebe la presencia de cada archivo en el método isMemberOf para determinar el icono bueno para mostrar? ¿Es la mejor manera de hacerlo o sería mejor, por ejemplo, almacenar toda la ruta del archivo dentro de una clave en el registro?

Gracias por su ayuda.

+0

¡Hola! resolviste el problema? – ManuParra

Cuestiones relacionadas