特定のファイルやフォルダーのアイコンオーバーレイが必要なアプリケーションがあります。
この目的のために、IShellIconOverlayIdentifierインターフェースを実装するシェル拡張機能を作成しました。c ++ / Qt(activeqt)でdllとして記述されており、tcpを使用して問題のアプリケーションに接続し、アプリケーションにクエリを実行して、アイコンオーバーレイを表示するかどうかを決定します。そのビルドはこれとほとんど同じです。
XP / Vista / 7では正常に動作しますが、Windows8では動作しません。
Windows 8では、dllがロードされます。私はそれをProcessExplorerで見ることができ、デバッグの一部として出力をファイルに記録するので、何が起こっているのかを確認し、何が起こっていないのかを推測できます。
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()を呼び出し、iid==IID_IShellIconOverlayIdentifierおよび他のすべてのiidのE_NOINTERFACEの場合はS_OKを取得します
- 次に、GetOverlayInfo()を呼び出して初期化します。アイコンファイルのパスなどを取得します。
- 次に、シェルが必要に応じてIsMemberOf()を呼び出して、ファイルまたはフォルダーのアイコンを表示する必要があるかどうかを確認します。
Windows 8で何が起こるか:
- ロード時にそのエクスプローラーはqueryInterface()を呼び出し、iid==IID_IShellIconOverlayIdentifierおよび他のすべてのiidのE_NOINTERFACEのときにS_OKを取得します
何もありません。queryInterface()が呼び出されていますが、その後は何も起こりません。アプリケーションがシェル拡張によって作成されたtcpソケットに正常に接続し、IPCが機能していることがわかります(アプリケーションとdllの間でデータを送受信できますが、他に何も起こりません。エクスプローラーは実装されたインターフェイスを使用していません。
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を除くすべてのWindows(> = xp)で機能します。
私は何が欠けていますか?ここからどこに行けばわかりますか?