Re[2]: VB'шный ParamArray на Delphi
От: -ras-  
Дата: 16.08.10 10:00
Оценка:
Вот спасибо! То что нужно!
Есть пара подводных камней, поэтому приведу развернутое решение — возможно кому-то сэкомномит время:

В классе (потомке 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.