0

特定のファイルやフォルダーのアイコンオーバーレイが必要なアプリケーションがあります。

この目的のために、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)で機能します。

私は何が欠けていますか?ここからどこに行けばわかりますか?

4

1 に答える 1

4

問題はレジストリキーがあったようです

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

ここで指定されているように、zippy32.exeによって設定されていません。以前のWindowsバージョンでは、設定されていない場合はこれを無視したと思いますが、Windows8ではこれが必要でした。手動で設定しました。

于 2012-11-01T10:28:57.523 に答える