Holy cow, I wrote a book!
MaxMax asks a number of resource-related questions,
"How do you Unlock a LockResource?" and
"What are the differences between FreeResource
It would be much easier to use a single function instead of a collection
It helps if you understand
the history of resources,
because the functions were designed back when resources were managed
very differently from how they are today.
The usage pattern
is still the same:
You unlock a resource by calling, um, UnlockResource.
Although the usage pattern is the same, the mechanism under the covers
is completely different.
In 16-bit Windows,
loading a resource entailed allocating a chunk of memory,
then filling that memory block from the disk image.
In Win32, resources are mapped into the address space as part of
the image; there is no memory allocation and no explicit loading.
The next thing to understand is that resources are just blobs of
They are not live objects.
It's not like there's a HBITMAP sitting in there just
waiting to be found.
Think of resource data as a set of blueprints.
If you call FindResource + LoadResource
+ LockResource, you wind up with the blueprints for
a radio, but that's not the same as actually having a radio.
To do that, you need to hand the radio blueprints to somebody who knows how
to read electronic schematic diagrams and who knows how to solder
wires together in order to convert the potential radio into an actual
If you've been following the sporadic series on the format of resources,
you'll know that these schematic diagrams can often be quite complicated.
The LoadBitmap function first does the
FindResource + LoadResource
+ LockResource dance to locate the bitmap blueprint,
but then it needs to actually make the bitmap,
which is done by parsing the raw resource data and trying to make
sense of it, calling functions like CreateBitmap and
to convert the blueprint into an actual bitmap.
That's why, if you use these helper functions like
LoadAccelerators to convert the blueprint
into an object,
you need to
use the corresponding cleanup function like
when you want to destroy the object.
You have to use the correct cleanup function, of course.
You can't destroy a bitmap with DestroyAcceleratorTable
any more than you can put a radio in the clothing drop bin.
Just like when the radio guy returns the original blueprints plus
a brand new radio,
you return the blueprints to the library,
but if you want to destroy the radio,
you have to take it to the electronics recycling facility.