2012-11-16 4 views
0

python2.7 및 py2exe를 사용하여 Python 스크립트에서 dll을 만듭니다.Windows에서 아이콘 오버레이가 탐색기에 반영되지 않음

DLL을 성공적으로 만들고 아이콘 오버레이 상태에 대한 항목을 등록한 다음 작업 관리자를 통해 Windows 탐색기 프로세스를 다시 시작했습니다.

내 항목이 레지스트리에 있는지 여부가 확인되었습니다. 그렇습니다.

하지만 특정 폴더 위치에 대한 python 테스트 응용 프로그램 스크립트를 통해 내 상태를 설정할 때.

선택한 경로의 모든 파일과 폴더가 오버레이 아이콘으로 오버레이 될 것으로 예상됩니다.

하지만 아니요, 아이콘 오버레이가 전혀 발생하지 않습니다.

하지만 DLL을 만들지 않고 (DLL을 만들지 않고) Python 스크립트를 통해 테스트를하고 내 테스트 응용 프로그램 스크립트를 통해 아이콘 오버레이를 설정할 때.

예, 완벽하게 작동합니다.

내 DLL을 시도 할 때 왜 발생하지 않는지 혼란 스럽습니다. ???

은 아래는 상태 항목

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

이 작업이 제대로 정말 고통을 등록하는 내 파이썬 스크립트입니다, goodluck는!

Windows는 10 개의 다른 아이콘 만 등록 할 수 있으며 알파벳순으로 등록 된 처음 10 개에서만 작동합니다. 이미 10 명이 등록되어 있습니까? Dropbox, Tortoise-svn 등이 설치되어 있고 각 이미지가 항목으로 계산 될 때 10을 초과하는 것은 매우 쉽습니다. 그렇다면 이름 앞에 밑줄이나 0을 붙여서 우선 순위를 확인하십시오. 다른 아이콘이 사라질 수도 있음을 의미하지만이 문제를 해결할 방법이 없다고 생각합니다.

가끔은 Windows가 아이콘 상태를 새로 고침하지 못하는 경우도 있습니다. 실행중인 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

저는 윈도우 7에서 일하고 있습니다. 제 앱의 엔트리가 우선 순위를 얻기 위해 레지스트리에 먼저 나열되도록했습니다. 내 문제는 동일한 파이썬 스크립트는 스크립트로 테스트 할 때 잘 작동하고 테스트 한 경우 제대로 작동하지 않는 DLL로 변환됩니다. u가 나에게 약간의 아이디어를 암시한다면, 루프 홀이 될 수 있는데, 이것이 나를 달성하는 데 큰 도움이 될 것입니다. 나에게 당신을 위해 잘 작동하는 샘플을주세요. –