2011-01-23 31 views
6

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:

+0

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

+1

Liên kết tới mã bị hỏng! – mtasic85

Trả lời

0

vấn đề được giải quyết. tôi đoán một cái gì đó đã được khởi tạo kém nhưng bây giờ nó hoạt động.

Mong muốn của tôi là tạo một thứ gì đó giống như dịch vụ dropBox.

tôi cần có thể cập nhật biểu tượng của một tệp nhất định theo trạng thái tải lên của nó. Tôi sẽ tạo một lớp cho mỗi trạng thái (tải lên, tải lên, thất bại) sẽ triển khai giao diện IID_IShellIconOverlayIdentifier. Nhưng sau đó ...

Tôi có nên viết danh sách các tệp hiện đang tải lên/failed_to_upload trong tệp cục bộ kiểm tra sự hiện diện của từng tệp vào phương pháp isMemberOf để xác định biểu tượng tốt để hiển thị không? Đó có phải là cách tốt nhất để làm điều đó hoặc nó sẽ là tốt hơn ví dụ để lưu trữ tất cả các đường dẫn tập tin bên trong một khóa trong registry?

Cảm ơn sự giúp đỡ của bạn.

+0

Xin chào! bạn đã giải quyết được vấn đề chưa? – ManuParra

Các vấn đề liên quan