In my current game engine, I've got my own surface class where I have the 565 layer and alpha layer separate. But I also store the layers as separate PNG images as well. I use the SHLoadImageFile function to load the PNGs into a HBITMAP object, and then a variation of PocketFrog's code to make sure it's in 565 format before transferring the data to my surface class.
The surface class has the following member variables:
int m_iWidth, m_iHeight;
BYTE *m_pPixels, *m_pAlpha;
So the m_pPixels variable is sized based on m_iWidth*m_iHeight*2 and m_pAlpha is only half that size.
I've also got my own blit function that takes into account if the image has an alpha layer, and then uses Tala's single-multiply blending function, which is linked to earlier in this thread.
My new game engine is still evolving, but it works incredibly well for this stuff, and almost all of the little tidbits I use can be found scattered in the forums here.