C++ windows 8 IShellIconOverlayIdentifier外壳扩展无法正常工作

C++ windows 8 IShellIconOverlayIdentifier外壳扩展无法正常工作,c++,windows,qt,windows-shell,C++,Windows,Qt,Windows Shell,我有一个应用程序,我想有图标覆盖的具体文件和文件夹 为此,我编写了一个实现IShellIconOverlayIdentifier接口的shell扩展。它以C++或Qt()的形式写为DLL,它使用TCP连接到应用程序,以查询应用程序以决定是否显示图标叠加。它的建造方式和我们的差不多 它在XP/Vista/7中运行良好,但在Windows8中不起作用 在windows 8中加载dll。我可以在中看到它,并且作为调试的一部分,它还将输出记录到一个文件中,以便我可以看到发生了什么并推断出没有发生什么 使

我有一个应用程序,我想有图标覆盖的具体文件和文件夹

为此,我编写了一个实现IShellIconOverlayIdentifier接口的shell扩展。它以C++或Qt()的形式写为DLL,它使用TCP连接到应用程序,以查询应用程序以决定是否显示图标叠加。它的建造方式和我们的差不多

它在XP/Vista/7中运行良好,但在Windows8中不起作用

在windows 8中加载dll。我可以在中看到它,并且作为调试的一部分,它还将输出记录到一个文件中,以便我可以看到发生了什么并推断出没有发生什么

使用我也可以看到,这是它的注册,而不是禁用,一般来说,一切看起来都好

类声明大致如下所示:

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\U IShellIconOverlayIdentifier和所有其他iid的E\U NOINTERFACE,则得到S\U OK
  • 然后调用GetOverlayInfo()来初始化内容。获取图标文件路径等
  • 然后,当shell需要时,它调用IsMemberOf()以查看是否应该显示文件或文件夹的图标
windows 8上发生了什么:

  • 加载时的资源管理器调用queryInterface()并在iid==iid\U IShellIconOverlayIdentifier和所有其他iid的E\U NOINTERFACE时获得S\U OK
没有别的了。正在调用queryInterface(),但之后什么也没有发生。我可以看到我的应用程序成功地连接到由外壳扩展创建的tcp套接字,IPC正在工作(我可以在应用程序和dll之间来回发送数据,但同样如此。没有其他事情发生。资源管理器没有使用实现的接口

dll是通过以下方式注册的:

regsvr32.exe shellext.dll
下面的注册表项也被添加

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\Shellextname ( value = CSLID )
为了在Windows8上进行测试,我还向

HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved
使用我的shell扩展名CSLID作为名称,data=Shellextname(如上一个键中所示),尽管这在XP/Vista/7上似乎并不重要,所以我猜它在这里也是无关紧要的

同样,这适用于除Windows8之外的所有windows(>=xp)


我遗漏了什么?我从这里到哪里去寻找呢?

似乎问题在于注册表项

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

regsvr32.exe没有设置指定值。我想以前的windows版本会忽略此值(如果未设置),但windows 8需要此值。手动设置它会起作用。

问题似乎在于注册表项

HKEY_CLASSES_ROOT\CLSID\{myguid}\InprocServer32
        ThreadingModel = Apartment
regsvr32.exe没有设置指定的。我猜以前的windows版本忽略了这个,如果它没有设置,但windows 8需要它。手动设置它可以工作