Здравствуйте, Аноним, Вы писали:
А>Возникла острая необходимость написать небольшое приложение под 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
Т.е. для С++ клиента надо сделать точно такой же Сейфаррей и передать его по ссылке в вариант.