Problem with overlapping icons with Python

I found some examples and topics on this forum on how to implement the icon mapping handler using Python 2.7 and the win32com package, but it does not work for me, and I don’t understand why.

I am creating a DLL and I have no error registering. I also tried directly with the script, but this is the same. He, as a class, is never called.

Here is the code:

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) 

Hi and thanks for your reply. I tested the log file as well as win32traceutil. Registration / non-registration messages are logged. Registry entries are also created under:

1 / HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ShellIconOverlayIdentifiers \ GD.TestServer 2 / HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Shell Extensions \ Approved 3 / directly under the root class.

I also added a few logs inside the getOverlayInfo, GetPriority and isMemberOf methods, but when viewing the explorer, I don't see the trace.

My configuration: Python 2.7 pywin32-214.win32-py2.7.exe Windows XP SP 2

You can download all the code here :

+6
python windows shell com py2exe
source share
1 answer

the problem is resolved. I think something was poorly initialized, but now it works.

My desire is to do something like dropBox service.

I need to update the icon of this file in accordance with its download status. I will create a class for each state (load, load, failure) that will implement the IID_IShellIconOverlayIdentifier interface. But then...

Should I write a list of files that are currently loaded / failed _to_upload in local files, check for the presence of each file in the isMemberOf method to determine a good icon to display? Is this the best way to do this, or would it be better, for example, to save the entire path to the file inside the key in the registry?

Thank you for your help.

0
source share

All Articles