views:

2326

answers:

3

I need a method to create Icon Overlay's for Folders and Files in Windows XP/Vista, using C# or C++? Any examples?

Thanks, -Sean!

+4  A: 

Tigris' TortoiseSVN product heavily uses icon overlays provided by library shared by several Tortoise products, the overlays themselves are written in C++ rather than C#.

The documentation for the TortoiseOverlays project explains how they use it and the problems they have encountered (username: guest, empty password), and the GPL'ed sourcecode is in the Subversion repository (same username/password as above).

Snippit from documentation:

TortoiseOverlays registers itself with the explorer to handle the nine states
mentioned above, i.e. it registers nine overlay handlers. The explorer
process initializes the TortoiseOverlays handler, calling its IShellIconOverlayIdentifier::GetOverlayInfo(). TortoiseOverlays looks for the
registered overlay handlers under HKLM\Software\TortoiseOverlays\\Statusname
and calls their  GetOverlayInfo() method so they can initialize too (Note that
any change to the icon name, index, ... your handler does are overwritten
later and won't be used - it's TortoiseOverlays that handles the icons now).
After the initialization, TortoiseOverlays relays every call to its IShellIconOverlayIdentifier::IsMemberOf() method to the other handlers. The
first handler that returns S_OK determines whether the icon is shown or not.
Richard Slater
Awesome! I'll have a look at this. Do you know how I could implement this into a C# project that I'm working on? Don't I basically just need to register a DLL?
Sean
As hinted by Stefan, there is a reason TortoiseSVN shell extensions are written in unmanaged code. You can always write much of the code in unmanaged then get it to call into your .NET application.
Richard Slater
Thanks. That's what I planned to do, I never intended to imply that I wanted to write the shell extension code in C#, I just wanted to access the C++ code from C#.
Sean
+6  A: 

Do not do this! Please, please don't.

You will break a lot of applications. Shell extensions must not use the .net framework (or any other similar framework), ever.

Here's an explanation why you must not do this.

Write your extension in C/C++, but not C#.

Stefan
I think you misunderstood what I was trying to say. I want to write the extension in C++ and use that from C#. Is that possible?
Sean
You want to get the overlays like explorer does in your own application? Now that's of course possible without breaking other apps.
Stefan
But if you just want overlays in your C# app, you don't need to write an overlay handler at all - that's just for explorer. If you need your own overlays, just do it without an overlay handler. The windows list control supports overlays already (you have to add an imagelist to the control, then specify one of 16 possible overlay icons from that list in the item mask).
Stefan
Sorry being so unclear, I just got my wisdom teeth out yesterday and I'm still a little drugged up. I want something like Dropbox (https://www.getdropbox.com) does. I want to be able to add custom icon overlays to files and folders that I choose. And I'll use C++.
Sean
In that case, yes, you have to implement an overlay handler. Here's a good example:http://www.codeproject.com/KB/shell/overlayicon.aspx
Stefan
This was helpful, but actually, I found a really great example in the "Microsoft Platform SDK," which compiled right away w/o any trouble. Thanks for all your help though. ;)
Sean
+1  A: 

Also, be aware of the system limitation for the number of shell overlays. From MSDN:

Note The number of different icon overlay handlers that the system can support is limited by the amount of space available for icon overlays in the system image list. There are currently fifteen slots allotted for icon overlays, some of which are reserved by the system. For this reason, icon overlay handlers should be implemented only if there are no satisfactory alternatives.

Nemanja Trifunovic
Thanks for informing me of this. Icon overlay's seem to to be a pretty shady subject for some reason (hard to find examples for them).
Sean