Surprise! My success is your failure

Windows APIs often use HRESULTs.  Almost every function returns an HRESULT and almost every caller is expected to check it.  COM provides a few helpers for these tasks: SUCCEEDED()/FAILED() broadly check for success or for failure; HRESULT_FROM_WIN32() constructures a failure code from a Win32 error code; etc.

There is also a naming convension.  Success codes are named FACILITY_S_REASON.  Failures are FACILITY_E_REASON.  But look out!  There lurk amoung the multitude of errors, some that disguise success as failure!

Consider ICancelMethodCalls::TestCancel().  This function is supposed to return RPC_S_CALLPENDING or RPC_E_CALL_CANCELED.  So a programmer might think they could simply call

BOOL fContinue = SUCCEEDED(p->TestCancel())

to see if the call is pending. 

I did this and discovered in testing that RPC_S_CALLPENDING is defined as a failure code: 0x80010115L.  So fCountinue is always FALSE in the code above.  It looks like RPC_S_WAITONTIMER is also this way. 

So much for naming convensions

Skip to main content