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);
....
сколько элементов ?
int AMin=VarArrayLowBound(MData,1); // минимальный номер — всегда должен быть 0 ??
int AMax=VarArrayHighBound(MData,1); // максимальный номер
Ну можно размер увеличить
int SizeArray=SizeArray+AMax+1;
VarArrayRedim(МData,SizeArray); // увеличиваем массив
|
|
|