Если вы собираетесь вызывать его из языка автоматизации, вам потребуется интерфейс, возвращаемый из IDispatch, и вам, вероятно, придется возвращать его хотя бы в виде IDispatch **. Для ретваля я думаю, что этого достаточно; для простых [out] параметров вам нужно передать его как VARIANT * (с типом варианта, установленным в VT_LPDISPATCH), чтобы язык автоматизации мог его понять.
Я не уверен, есть ли хороший учебник; Прошло много времени с тех пор, как я искал исчерпывающую ссылку. Лучший совет, который я могу дать, это убедиться, что все, что вы передаете, совместимо с автоматизацией (например, это тип, который вы можете поместить в VARIANT), и это должно решить 80% ваших проблем. Это очень выполнимо, хотя; просто прочитайте на MSDN, и все будет в порядке.