Holy cow, I wrote a book!
One of the problems beginners run into when they start using
shell common controls is that they forget to call
the InitCommonControls function.
But if you were to disassemble the
InitCommonControls function itself, you'll see that it,
like the FlushInstructionCache function,
doesn't actually do anything.
Then why do you need to call it?
As with FlushInstructionCache,
what's important is not what it performs, but just the fact
that you called it.
Recall that merely listing a lib file in your dependencies
doesn't actually cause your program to be bound to the corresponding DLL.
You have to call a function in that DLL in order for there to be
an import entry for that DLL.
InitCommonControls is that function.
Without the InitCommonControls function,
a program that wants to use the shell common controls library
would otherwise have no reference to COMCTL32.DLL in its import table.
This means that when the program loads,
COMCTL32.DLL is not loaded and therefore is not initialized.
Which means that it doesn't register its window classes.
Which means that your call to
the CreateWindow function
because the window class has not been registered.
That's why you have to call a function that does nothing.
It's for your own good.
(Of course, there's the new
that lets you specify which classes you would like to be registered.
Only the classic
Windows 95 classes are registered when COMCTL32.DLL loads.
For everything else you have to ask for it explicitly.)