Tôi đã tìm thấy một số ví dụ và chủ đề trên diễn đàn này về cách triển khai trình xử lý lớp phủ biểu tượng với Python 2.7 & gói win32com nhưng nó không hoạt động cho tôi và tôi không hiểu tại sao.Vấn đề lớp phủ biểu tượng với Python
Tôi tạo DLL và tôi không gặp lỗi khi đăng ký. Tôi cũng đã thử trực tiếp với kịch bản nhưng nó giống nhau. Nó giống như lớp học không bao giờ được gọi.
Đây là mã:
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 và cảm ơn cho câu trả lời của bạn. Tôi đã thử nghiệm với một tệp nhật ký và cũng là win32traceutil. Các thông báo đăng ký/hủy đăng ký được ghi lại. Các mục đăng ký cũng được tạo ra dưới:
1/HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ShellIconOverlayIdentifiers \ GD.TestServer 2/HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Shell Extensions \ Approved 3/trực tiếp dưới lớp gốc.
Tôi cũng đã thêm một số nhật ký bên trong phương thức getOverlayInfo, GetPriority và isMemberOf nhưng tôi không thể thấy một dấu vết khi tôi duyệt qua trình khám phá.
cấu hình của tôi là: Python 2.7 pywin32-214.win32-py2.7.exe Windows XP SP 2
Bạn có thể tải về tất cả các mã here:
Viết các mục nhập vào tệp nhật ký để xem các hàm nào thực sự được gọi (nếu có). Các cuộc gọi đến 'DllRegisterServer' đặc biệt quan tâm ở đây. – AndiDog
Liên kết tới mã bị hỏng! – mtasic85