Вот спасибо! То что нужно!
Есть пара подводных камней, поэтому приведу развернутое решение — возможно кому-то сэкомномит время:
В классе (потомке TAutoObject) определил метод как
procedure Echo(var args: PSafeArray); safecall;
Для того чтобы метод был распознан как метод с переменным числом аргументов необходимо создать TypeLibrary и прописать для него аттрибут [vararg].
Delphi (как минимум до 2007 включительно) не позволяет [vararg] напрямую, но есть обходной путь:
1) экспортируем TLB в IDL
2) добавляем аттрибут [vararg] к описанию метода
[
id(0x000000C9), vararg
]
HRESULT _stdcall Echo([in] SAFEARRAY(VARIANT) * args );
3) компилируем IDL обратно в TLB с помощью
MIDL /client none /server none /tlb libraryname.tlb /win32 libraryname.idl
4) _заменяем_ существующий tlb-файл в каталоге проекта новым
Дальше — как обычно, собираем и регистрируем automation библиотеку в системе, и вызываем наш метод.
Второй подводный камень — если вам как и мне нужно обойтись без регистрации COM в системе. В этом случае нужно создать TLB, TLB.pas и имлементацию как для обычного AutomationObject, а затем:
1) унаследовать ваш AutomationObject от TAutoIntfObject вместо TAutoObject
2) удалить создание TAutoObjectFactory из блока initialization
3) вручную загружать ITypeLibrary из ресурсов и отдавать ее в конструктор объекта
var
TypeLib : ITypeLib;
begin
...
OleCheck(LoadTypeLib(PWideChar(ParamStr(0)), TypeLib));
obj := TScriptHelper.Create(TypeLib, IScriptHelper);