我有一個應用程序,我想要爲特定文件和文件夾設置圖標疊加層。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)。
我在想什麼?我從哪裏去找出答案?