2012-11-16 49 views
0

我使用python2.7和py2exe从我的python脚本创建dll。图标覆盖窗口不反映在资源管理器中

成功创建了DLL并为我的图标叠加状态注册了一个条目,然后通过任务管理器重新启动了Windows资源管理器进程。

验证我的入口是否在注册表中,是的,它在那里。

但是,当我通过python测试应用程序脚本为特定文件夹位置设置我的状态时。

我预计所选文件夹中的所有文件和文件夹都应该覆盖图标。

但是,不,图标叠加根本没有发生。

但是,当我通过python脚本测试注册表项(不创建DLL),并通过我的测试应用程序脚本设置我的图标覆盖。

是的,它的工作完美。

我很困惑,为什么它不会发生时,与我的DLL尝试?

下面是我的Python脚本来注册状态条目

import os 
import win32traceutil 
import pythoncom 
import winerror 
from win32com.shell import shell, shellcon 
from multiprocessing.connection import Client 

REG_PATH = r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers' 
REG_KEY = "IconOverlayTest" 

class IconOverlay: 
    _reg_desc_  = 'Icon Overlay COM Server' 
    _public_methods_ = ['GetOverlayInfo', 'GetPriority','IsMemberOf'] 
    _com_interfaces_ = [shell.IID_IShellIconOverlayIdentifier, pythoncom.IID_IDispatch] 
    def __init__(self, *_args, **_kwargs): 
     self._icon = None 
     self._icon_id = None 
     raise NotImplementedError 
    def GetOverlayInfo(self): 
     return self._icon, 0, shellcon.ISIOI_ICONFILE 
    def GetPriority(self): 
     return 0 
    def IsMemberOf(self, path, _attrs): 
     if is_member(path, self._icon_id): 
      return winerror.S_OK 
     return winerror.E_FAIL 

class IconOverlay_test(IconOverlay): 
    _reg_progid_  = 'a.TestServer1' 
    _reg_clsid_  = '{8B19F050-8354-11E1-A0FE-5C260A5D15E4}' 
    def __init__(self): 
     self._icon = "C:\\Users\\Administrator\\mat\\icon_overlay\\icons\\1.ico" 
     self._icon_id = 101 

classes = [IconOverlay_test,] 

def is_member(path, icon_id): 
    try: 
     conn = None 
     conn = Client("\\\\.\\pipe\\test.listener", "AF_PIPE") 
     conn.send(path) 
     if conn.poll(3): 
      reply = conn.recv() 
      return reply == icon_id 
    except Exception: 
     pass 
    finally: 
     conn and conn.close() 
    return False 

def DllRegisterServer(): 
    print("Registering %s ......."%IconOverlay._reg_desc_) 
    import winreg 
    #winreg = _winreg 
    for view in [winreg.KEY_WOW64_64KEY, winreg.KEY_WOW64_32KEY]: 
     for cls in classes: 
      with winreg.CreateKeyEx(winreg.HKEY_LOCAL_MACHINE, r"%s\%s" % 
        (REG_PATH, cls._reg_progid_), 0, 
        winreg.KEY_ALL_ACCESS|view) as hkey: 
       print(" %s"%cls) 
       winreg.SetValueEx(hkey, None, 0, winreg.REG_SZ, cls._reg_clsid_) 
    print("Registration complete: %s" % IconOverlay._reg_desc_) 

def DllUnregisterServer(): 
    print("Unregistering %s ......."%IconOverlay._reg_desc_) 
    import winreg 
    #winreg = _winreg 
    for view in [winreg.KEY_WOW64_64KEY, winreg.KEY_WOW64_32KEY]: 
     for cls in classes: 
      try: 
       _key = winreg.DeleteKeyEx(winreg.HKEY_LOCAL_MACHINE, r"%s\%s" 
         % (REG_PATH, cls._reg_progid_), 
         winreg.KEY_ALL_ACCESS|view) 
      except WindowsError as err: 
       if err.errno != 2: 
        raise 
    print("Unregistration complete: %s" % IconOverlay._reg_desc_) 

if __name__ == '__main__': 
    from win32com.server import register 
    register.UseCommandLine(*classes, 
          finalize_register = DllRegisterServer, 
          finalize_unregister = DllUnregisterServer) 

回答

0

这真是痛苦获得工作的权利,好运!

我相信Windows只会允许注册10个不同的图标,并且它只会与前10个按字母顺序注册的工作。你已经有10个注册?如果您安装了Dropbox,tortoise-svn等,因为每个图像都被视为条目,所以超过10个很容易。如果是这种情况,请在名称前加上一个下划线或0,以确保它优先,但这意味着另一个图标将失去 - 我认为没有办法解决这个问题。

有时窗户不知道刷新图标的状态。你正在运行哪个版本的Windows?有些比其他人差。我似乎记得XP在这方面不太擅长。有一些技巧可以让它更新,但你可以通过windows api刷新窗口,但看起来很可怕,整个浏览器都会闪烁。我发现一个更好的方法是更改​​文件上的属性。这是我使用的技巧:

import stat,os 

file_att= os.stat(path)[0] 
if file_att & stat.S_IWRITE: 
    os.chmod(path,stat.S_IREAD) 
    os.chmod(path,stat.S_IWRITE) 
else: 
    os.chmod(path,stat.S_IWRITE) 
    os.chmod(path,stat.S_IREAD) 
+0

我在Windows 7工作。我确保我的应用程序条目首先列在注册表中以获得优先级。我的问题是相同的python脚本在作为脚本进行测试时效果很好,并且将其转换为dll,这些dll在测试时无法正常运行。如果你告诉我一些想法,可能会出现循环漏洞,这对我来说是一个很大的帮助。给我一个适合你的样品。 –

相关问题