Ok, it appears SelectObject does set GetLastError. My mistake.

The first time the draw methos is called CreateCompatibleDC set GetLastError to 0 (success). On subsequent calls it sets it to 87 (invalid parameter). However it still returns a non NULL HDC. SelectObject consistently sets GetLastError to 0, but returns a NULL HGDIOBJ.

Curiouser and curiouser. What's going on here.