See the question and my original answer on StackOverflow

There are two different technologies involved in your question:

  • COM Automation, wich evolves around the IDispatch interface and friends (especially the restricted type system which doesn't need specific marshaling code because OLEAUT does the job automatically when it gets a TLB)
  • VBScript, which is one specific COM Automation client.

out or in/out parameters that are not VARIANT are fine for COM automation in general, but not for VBScript, as VBScript basically only knows VARIANTs.

You will find the definitive explanation on Eric Lippert's blob here: In, Out, In-Out, Make Up Your Mind Already