2011-01-23 74 views
6

我在本論壇中發現了一些關於如何使用Python 2.7 & win32com包實現圖標疊加處理程序的方法,但它不適用於我,我不明白爲什麼。Python中的圖標疊加問題

我創建了DLL,註冊時沒有錯誤。我也直接嘗試了這個腳本,但它是一樣的。這就像這個班從來沒有打過電話。

下面是代碼:

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) 

你好,感謝你的答案。 我已經測試了一個日誌文件和win32traceutil。登記/不註冊消息被記錄。下還會創建註冊表項:

1/HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \ Explorer中\ ShellIconOverlayIdentifiers \ GD.TestServer 2/HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \外殼擴展\批准 3 /直接在類根下。

我還在方法getOverlayInfo,GetPriority和isMemberOf中添加了一些日誌,但是當我瀏覽資源管理器時無法看到跟蹤信息。

我的配置是: 的Python 2.7 pywin32-214.win32-py2.7.exe 的Windows XP SP 2

您可以下載所有的代碼here

+0

將條目寫入日誌文件以查看實際調用了哪些函數(如果有的話)。調用`DllRegisterServer`特別感興趣。 – AndiDog 2011-01-23 19:09:41

+1

鏈接到代碼已損壞! – mtasic85 2011-07-13 15:39:40

回答

0

問題就迎刃而解了。我想有些東西是初始化不好,但現在它起作用了。

我的願望是做出像dropBox服務。

我需要能夠根據其上傳狀態更新給定文件的圖標。我將爲每個狀態創建一個類(上傳,上傳,失敗),實現IID_IShellIconOverlayIdentifier接口。但是然後...

我應該在當地文件中寫入正在上傳/ failed_to_upload的文件列表,檢查每個文件是否存在到isMemberOf方法中,以確定要顯示的好圖標?這是做這件事的最好方法嗎?或者最好是將所有文件路徑存儲在註冊表中的某個鍵中?

感謝您的幫助。