2011-01-23 15 views
6

Ho trovato alcuni esempi e argomenti su questo forum sul modo di implementare un gestore di sovrapposizione di icone con Python 2.7 & il pacchetto win32com ma non funziona per me e non capisco perché.Problema di sovrapposizione di icone con Python

Creo la DLL e non ho alcun errore quando la registro. Ho anche provato direttamente con lo script ma è lo stesso. È come se la classe non fosse mai chiamata.

Ecco il codice:

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) 

Ciao e grazie per la risposta. Ho testato con un file di registro e anche win32traceutil. I messaggi di registrazione/non registrazione vengono registrati. Le voci di registro vengono creati anche sotto:

1/HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ShellIconOverlayIdentifiers \ GD.TestServer 2/HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Shell Extensions \ Approvato 3/direttamente sotto la radice della classe.

Ho anche aggiunto alcuni registri nei metodi getOverlayInfo, GetPriority e isMemberOf ma non riesco a vedere una traccia quando sfoglio l'esploratore.

La mia configurazione è: Python 2.7 pywin32-214.win32-py2.7.exe Windows XP SP 2

È possibile scaricare tutto il codice here:

+0

Scrivere le voci in un file di registro per vedere quali funzioni sono effettivamente chiamate (se non del tutto). Le chiamate a 'DllRegisterServer' sono particolarmente interessanti qui. – AndiDog

+1

Il collegamento al codice è rotto! – mtasic85

risposta

0

problema risolto. Immagino che qualcosa sia stato inizializzato male ma ora funziona.

Il mio desiderio è di creare qualcosa come il servizio DropBox.

Ho bisogno di essere in grado di aggiornare l'icona di un dato file in base al suo stato di caricamento. Creerò una classe per ogni stato (caricamento, caricato, non riuscito) che implementerà l'interfaccia IID_IShellIconOverlayIdentifier. Ma poi ...

dovrei scrivere l'elenco di file che stanno attualmente caricando/failed_to_upload in file locali la verifica della presenza di ogni file nel metodo isMemberOf per determinare l'icona valida da visualizzare? È il modo migliore per farlo o sarebbe meglio, ad esempio, memorizzare tutto il percorso del file all'interno di una chiave nel registro?

Grazie per il vostro aiuto.

+0

Ciao! hai risolto il problema? – ManuParra

Problemi correlati