C++ windows 8 IShellIconOverlayIdentifier外壳扩展无法正常工作
我有一个应用程序,我想有图标覆盖的具体文件和文件夹 为此,我编写了一个实现IShellIconOverlayIdentifier接口的shell扩展。它以C++或Qt()的形式写为DLL,它使用TCP连接到应用程序,以查询应用程序以决定是否显示图标叠加。它的建造方式和我们的差不多 它在XP/Vista/7中运行良好,但在Windows8中不起作用 在windows 8中加载dll。我可以在中看到它,并且作为调试的一部分,它还将输出记录到一个文件中,以便我可以看到发生了什么并推断出没有发生什么 使用我也可以看到,这是它的注册,而不是禁用,一般来说,一切看起来都好 类声明大致如下所示: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。我可以在中看到它,并且作为调试的一部分,它还将输出记录到一个文件中,以便我可以看到发生了什么并推断出没有发生什么 使
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()以查看是否应该显示文件或文件夹的图标
- 加载时的资源管理器调用queryInterface()并在iid==iid\U IShellIconOverlayIdentifier和所有其他iid的E\U NOINTERFACE时获得S\U OK
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需要它。手动设置它可以工作