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