Kimmeh
Kimmeh

Reputation: 1011

windows 8 IShellIconOverlayIdentifier shell extension not working properly

I have an application where i want to have icon overlays for specific files and folders.

For this purpose i've written a shell extension that implements the IShellIconOverlayIdentifier interface. Its written in c++ / Qt (activeqt) as a dll that connects to the application in question using tcp to query the application to decide wether to show the icon overlay or not. Its buildt much the same way this is.

It works fine in XP/Vista/7 but it wont work in windows 8.

In windows 8 the dll is loaded. I can see it in process explorer and also as a part of debugging it also logs output to a file so i can see whats happening and infer whats not.

Using ShellExView i can also see thats its registered, not disabled and in general everything looks ok.

The class declaration looks more or less like this:

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); 
};

Whats happens on XP/Vista/7 :

What happens on windows 8 :

And nothing else. queryInterface() is getting called, but after that nothing happens. I can see my application connecting successfully to the tcp socket created by the shell extension and IPC is working( i can send data back and forth between the application and the dll, but again. Nothing else happens. Explorer is not using the implemented interface.

The dll is registered using:

regsvr32.exe shellext.dll

and the registry key below is also added

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\Shellextname ( value = CSLID )

for testing on windows 8 i've also added the following key to

HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved

with my shell extensions CSLID as the name and data = Shellextname ( as above in the previous key) though this doesn't seem to matter on XP/Vista/7 so i'm guessing its inconsequential here as well.

Again, this works on every windows( >= xp) except windows 8.

What am i missing? Where do i go from here to find out?

Upvotes: 0

Views: 2124

Answers (1)

Kimmeh
Kimmeh

Reputation: 1011

It seems the problem was that the registry key

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

as specified here was not set by regsvr32.exe. I guess previous windows versions ignored this if it wasn't set, but windows 8 required it. Setting it manually worked.

Upvotes: 4

Related Questions