Re: Как передать массив объектов в виде VARIANT
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 02.04.04 11:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возникла острая необходимость написать небольшое приложение под AutoCAD с использованием OLE Automation. Документация по всему этому есть только для VBA, а я пишу на С++. В один из методов (штриховка контура) требуется передавать массив объектов, которые составляют контур в AutoCAD. Как это сделать на VBA описано в Help. Однако на основе этой информации я не понял, как это сделать на С++. Метод, сгенерированный в качестве обертки из TypeLibrary требует массив объектов


Итак, скриптовый клиент SAX Basic

Sub Main
    
Dim obj1 As New Class1
Dim arr(2) As Class2

Set arr(0) = New Class2
Set arr(1) = New Class2

obj1.TestArray(arr)
End Sub



interface IClass1 : IDispatch{
    [id(1), helpstring("method TestArray")] HRESULT TestArray([in] VARIANT array);
};



В метод приходит вариант с VT = 0x6009.

VT_DISPATCH = 9,
VT_ARRAY = 0x2000,
VT_BYREF = 0x4000,

Посколько пришел VT_BYREF, то надо заглядывать не в array.parray, а array.pparray.

array.pparray->fFeatures равняется 0x450

FADF_DISPATCH 0x0400
FADF_HAVEIID 0x0040
FADF_FIXEDSIZE 0x0010


Т.е. для С++ клиента надо сделать точно такой же Сейфаррей и передать его по ссылке в вариант.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.