See the question and my original answer on StackOverflow

This piece of code:

if (SUCCEEDED(hr) && container) hr = container->FindConnectionPoint(__uuidof(IWMPEvents), &callback);
if (FAILED(hr) && container)
    hr = container->FindConnectionPoint(__uuidof(_WMPOCXEvents), &callback);

Will succeed on the first line, so you will hook events on the IWMPEvents only, you will not continue and hook _WMPOCXEvents.

IWMPEvents are early-bound (IUnknown derived) events, so the Media Player will indeed call IWMPEvents::PlayStateChange(...) IWMPEvents::StatusChange(...) etc. but it won't call IDispatch::Invoke with corresponding DISPIDs.

If you want IDispatch events, just remove the first FindConnectionPoint, or call both.