2012-10-31 80 views
0

我有一個應用程序,我想要爲特定文件和文件夾設置圖標疊加層。windows 8 IShellIconOverlayIdentifier外殼擴展無法正常工作

爲此,我編寫了一個實現IShellIconOverlayIdentifier接口的shell擴展。它用C++/Qt編寫(activeqt)作爲一個dll,使用tcp連接到有問題的應用程序來查詢應用程序以決定是否顯示圖標疊加。它的構建方式與this相同。

它可以在XP/Vista/7的罰款,但它在Windows 8

在DLL加載Windows 8中不會工作。我可以在process explorer中看到它,並且作爲調試的一部分,它還將輸出記錄到文件中,以便我可以看到發生了什麼並推斷出什麼不是。

使用ShellExView我也可以看到它的註冊,沒有禁用,一般情況下一切看起來不錯。

類的聲明看起來或多或少是這樣的:

class Q_DECL_EXPORT OverlayClass : 
    public QAxAggregated, 
    public IShellIconOverlayIdentifier{ 
public: 
    // Implements IUnknown 
    QAXAGG_IUNKNOWN; 

    JShellOverlayWorking(); 

    // Implements IShellIconOverlayIdentifier 
    STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD* pdwFlags); 
    STDMETHOD(GetPriority)(int* pPriority); 
    STDMETHOD(IsMemberOf)(LPCWSTR pwszPath, DWORD dwAttrib); 

    //pure virtual from QAxAggregated 
    long queryInterface(const QUuid &iid, void**iface); 
}; 

什麼在XP/Vista/7的情況:

  • 負載是探險家第一次調用QueryInterface(),並得到一個S_OK如果iid == IID_IShellIconOverlayIdentifier和E_NOINTERFACE其他所有其他iid的
  • 然後它繼續調用GetOverlayInfo()來初始化東西。獲取圖標文件路徑等
  • 然後,當shell需要調用IsMemberOf()以查看它是否應顯示文件或文件夾的圖標。

在Windows 8上,會發生什麼:

  • 上載探險調用QueryInterface(),並得到一個S_OK時IID == IID_IShellIconOverlayIdentifier和E_NOINTERFACE所有其他IID的

,並沒有別的。 queryInterface()被調用,但之後沒有任何反應。我可以看到我的應用程序成功連接到由外殼擴展創建的tcp套接字,並且IPC正在工作(我可以在應用程序和dll之間來回發送數據,但是沒有其他發生,Explorer沒有使用實現的接口。

DLL被使用登記:

regsvr32.exe shellext.dll 

和下面的註冊表項也被添加

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\Shellextname (value = CSLID) 

在Windows 8測試我還增加了以下關鍵

HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved 

與CSLID的名稱和數據我的外殼擴展= Shellextname(如上前一個關鍵)儘管這似乎並沒有在XP/Vista/7的,所以我猜它無關緊要這裏也沒關係。

此外,這適用於除Windows 8以外的每個窗口(> = xp)。

我在想什麼?我從哪裏去找出答案?

回答

4

看來問題是,註冊表項

HKEY_CLASSES_ROOT\CLSID\{myguid}\InprocServer32 
     ThreadingModel = Apartment 

按規定here沒有被regsvr32.exe的設置。我想先前的Windows版本忽略了這個,如果它沒有設置,但Windows 8需要它。設置它手動工作。