So it turns out that you can implement non-interactive approvers (for instance, to shoot down spam IM channels before the tray icon blinks at the user, or to grab a SASL channel before the user is prompted for a password) as observers, as follows:
• When ObserveChannels() is called,
• Call Claim() on the CDO;
• Then return from ObserveChannels();
• and then Claim will return successfully if you claimed the channels, and failure if someone else got there first.
This should be documented somewhere.
I think such pseudo-approvers SHOULD have DelayApprovers=TRUE (from Bug #32267).
Here you go. I commented out the DelayApprovers=TRUE bit because it's not merged yet.
Oops, not sure why I hadn't merged this. Done now.