SAFEARRAY - это лучший способ, если вы хотите совместимость с OLE-Automation и, возможно, используете интерфейс COM из других языков, таких как VB6. Но в IDL есть альтернатива, например: -
void Fx([in] long cItems, [in, size_is(cItems)] BYTE aItems[]);
Здесь описывается метод, в котором код маршаллинга может вывести число байтов, подлежащих передаче, проверяя значение первого параметра.
Это хорошо, если все ваши клиенты написаны на C / C ++, но я думаю , что интерфейс, содержащий это, не будет совместимым с автоматизацией, поэтому не может использоваться из VB6, и возможно стандартный маршалер не сможет выполнить маршалинг, поэтому вам нужно будет сгенерировать свою собственную DLL прокси / заглушки из IDL. Не сложно сделать, но немного сложнее, чем использовать SAFEARRAY.