It turns out that we've stored a great many copies of the pointer to the COM object, so I figured if I eliminated all of the extra copies, maybe I could eliminate the bug.
Then I discovered that every once in a while, we use a different copy of the COM object that isn't the big shared one. So now I need to put the pointer back in the objects that collectively were holding too many copies of the pointer to the shared COM object, but ignore the value that's there when I should be using the shared pointer.
My brain hurts. I hate modifying other people's code, especially when it could use just a wee bit more documentation.