Paul, thought it might be better to have a different thread for /CHECK_WINIO.
One thing I did find 'confusing' (could be just me): when arguments have been swapped, specifically when a callback and variable are swapped. The error message given when this occurs is (example) 'error 1222 - Argument number 2 (ABCD) of WINIO@ should be a 32 bit integer'.
The text of the 1222 message could be made clearer i.e. 'Argument number 2 (ABCD) of WINIO@ should be a 32 bit integer function'., identifying the type of the argument that should be present.
It is exceptionally nice to have the argument position and variable name defined explicitly! It really helps.
The error message for a LOGICAL (or REAL*4) in the wrong place (error 140) is explicit, but does not identify the variable or its position in the argument. This error is not dependent on /CHECK_WINIO, which is nice because compilation can continue. But for complex winio@() calls, it can take a while to figure things out.