C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как получить массив от COM-объекта?
Aractan
Отправлено: 01.04.2005, 07:40


Ученик-кочегар

Группа: Участник
Сообщений: 22



Объект inprocess, но такой вот код не работает
[
id(0x00000003)
]
HRESULT _stdcall GetData([out] long * Len, [out] double ** Array );

STDMETHODIMP TDeviceEmulatorImpl::GetData(double** Array, long* Len)
{
*Len=5;
*Array=reinterpret_cast<double*>(CoTaskMemAlloc(sizeof(double)*(*Len)));
(*Array)[1]=26;
(*Array)[0]=23;
(*Array)[2]=27;
return S_OK;
}
а такой C++Builder 6 не компилирует

[
id(0x00000003)
]
HRESULT _stdcall GetData([out] long * Len, [out,size_is(,*Len)] double ** Array );

1.Что делать?
2. Почему 1-й пример не пашет в inprocess объекте? м.б. потому что я использую oleautomation интерфейс и proxy/stub создаются не зависимо(только вот зачем?) от того inprocess объект или нет?
[
uuid(19F45BD1-5FDB-44C7-8654-5F24B37E015E),
version(1.0),
helpstring("Dispatch interface for DeviceEmulator Object"),
dual,
oleautomation
]
interface IDeviceEmulator: IDispatch
{
...
[
id(0x00000003)
]
HRESULT _stdcall GetData([out] long * Len, [out] double ** Array );
...
};
Aractan
Отправлено: 01.04.2005, 11:31


Ученик-кочегар

Группа: Участник
Сообщений: 22



Если кому интересно, то:
1. oleautomation интерфейсы можно использовать только с простыми типами, т.е. double** использовать нельзя и [size_is] соответственно тоже нельзя.
2. Для inprocess объектов [size_is] не нужен в принципе, т.е. маршлинг не происходит в этом случае.
avc*
Отправлено: 01.04.2005, 11:36


Не зарегистрирован







Естественно, что массивы нужно передавать "по значению" — пакуем все элементы в одну строку — передаем — распаковываем. Я так передавал экземпляры класса.
Arkadii
Отправлено: 11.05.2005, 15:29


Не зарегистрирован







А давайте Variant будем посылать ??
:
Variant APoint

int D1[3] = {0,2};APoint=VarArrayCreate(D1,1,varDouble);
APoint.PutElement((double)0,0);
APoint.PutElement((double)0,1);
APoint.PutElement((double)0,2);

Получаем Variant И шлем куда хотим ???
типы в Helpe можно все значения посмотреть (varDouble)

Ах да достать
Variant MData (Получаем чегото)

N=(Double)MData.GetElement(1);
....


smile.gif
сколько элементов ?
int AMin=VarArrayLowBound(MData,1); // минимальный номер — всегда должен быть 0 ??
int AMax=VarArrayHighBound(MData,1); // максимальный номер

Ну можно размер увеличить

int SizeArray=SizeArray+AMax+1;

VarArrayRedim(МData,SizeArray); // увеличиваем массив



Вернуться в Технологии COM/DCOM, ActiveX