Доброго времени суток!
Столкнулся с проблемой, которую никак не получается победить.
Под 64-битной Windows 7 не работает Windows Icon Overlay, но под 32-битной Windows 7 все работает замечательно.
Код из примера простой. Выводит иконку для папок в c:\Python27\Lib\
Код:
import os
from win32com.shell import shell, shellcon
import winerror
class IconOverlay:
_reg_clsid_ = '{3f9b50d1-43c1-11e4-9224-e0cb4e24e4ef}'
_reg_progid_ = 'TJG.PythonPackagesOverlayHandler'
_reg_desc_ = 'Icon Overlay Handler to indicate Python packages'
_public_methods_ = ['GetOverlayInfo', 'GetPriority', 'IsMemberOf']
_com_interfaces_ = [shell.IID_IShellIconOverlayIdentifier]
def GetOverlayInfo(self):
return (r'e:\Data\ppf.ico', 0, shellcon.ISIOI_ICONFILE)
def GetPriority(self):
return 50
def IsMemberOf(self, fname, attributes):
if os.path.exists (os.path.join (fname, "__init__.py")):
return winerror.S_OK
return winerror.E_FAIL
if __name__=='__main__':
import win32api
import win32con
import win32com.server.register
win32com.server.register.UseCommandLine (IconOverlay)
keyname = r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\PyPackageOverlay'
key = win32api.RegCreateKey (win32con.HKEY_LOCAL_MACHINE, keyname)
win32api.RegSetValue (key, None, win32con.REG_SZ, IconOverlay._reg_clsid_)
В процессе поисков решения нашел другой вариант кода, который вроде бы расчитан и на 64-битные версии.
Код:
import os
import platform
import win32gui
import win32con
import winerror
import pythoncom
from win32com.shell import shell, shellcon
REG_PATH = r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers'
MACHINE_64_BIT = True if platform.machine() == "AMD64" else False
class TestClass:
_reg_clsid_ = '{4FC554DF-F0EE-4A4F-966C-9C49CCF14D59}'
_reg_progid_ = 'TJG.PythonPackagesOverlayHandler'
_reg_desc_ = 'Icon Overlay Handler'
_public_methods_ = ['GetOverlayInfo', 'GetPriority', 'IsMemberOf']
_com_interfaces_ = [shell.IID_IShellIconOverlayIdentifier]
def GetOverlayInfo(self):
return (r'e:\Data\ppf.ico', 0, shellcon.ISIOI_ICONFILE)
def GetPriority(self):
return 50
def IsMemberOf(self, fpath, attributes):
if os.path.exists(os.path.join(fpath, "__init__.py")):
return winerror.S_OK
return winerror.E_FAIL
classes = [TestClass]
def DllRegisterServer():
print "Registering %s" % REG_PATH
import _winreg
if MACHINE_64_BIT:
for access in [_winreg.KEY_WOW64_64KEY, _winreg.KEY_WOW64_32KEY]:
key = _winreg.CreateKeyEx(_winreg.HKEY_LOCAL_MACHINE, REG_PATH, 0, _winreg.KEY_ALL_ACCESS | access)
for cls in classes:
subkey = _winreg.CreateKeyEx(key, cls._reg_progid_, 0, _winreg.KEY_ALL_ACCESS | _winreg.KEY_WOW64_64KEY)
_winreg.SetValueEx(subkey, None, 0, _winreg.REG_SZ, cls._reg_clsid_)
print "Registration complete on 64 bit Machine: %s" % cls._reg_desc_
else:
key = _winreg.CreateKey(_winreg.HKEY_LOCAL_MACHINE, REG_PATH)
for cls in classes:
subkey = _winreg.CreateKey(key, cls._reg_progid_)
_winreg.SetValueEx(subkey, None, 0, _winreg.REG_SZ, cls._reg_clsid_)
print "Registration complete: %s" % cls._reg_desc_
def DllUnregisterServer():
print "Unregistering %s" % REG_PATH
import _winreg
if MACHINE_64_BIT:
for cls in classes:
for access in [_winreg.KEY_WOW64_64KEY, _winreg.KEY_WOW64_32KEY]:
try:
key = _winreg.DeleteKeyEx(_winreg.HKEY_LOCAL_MACHINE, r"%s\%s" % (REG_PATH, cls._reg_progid_),
_winreg.KEY_ALL_ACCESS | access)
except WindowsError, details:
import errno
if details.errno != errno.ENOENT:
raise
print "Unregistration complete on 64 bit machine: %s" % cls._reg_desc_
else:
for cls in classes:
try:
key = _winreg.DeleteKey(_winreg.HKEY_LOCAL_MACHINE, r"%s\%s" % (REG_PATH, cls._reg_progid_))
except WindowsError, details:
import errno
if details.errno != errno.ENOENT:
raise
print "Unregistration complete: %s" % cls._reg_desc_
if __name__ == '__main__':
from win32com.server import register
register.UseCommandLine(*classes,
finalize_register=DllRegisterServer,
finalize_unregister=DllUnregisterServer)
Со вторым примером такая же ситуация - работает под 32-битной версией и никакой реакции в 64-битной Windows.
Кто-то может объяснить, в чем проблема?
Пробовал Python версий 2.7 и 3.7 и разрядностью 32 и 64 бита.
Там, где работает установлен только Python 2.7 32-разрядный.
На картинке - как это примерно выглядит, когда работает
Оба варианта скрипта и иконка - во вложении.