array as variant

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Vyacheslav
Сообщения: 11
Зарегистрирован: 27 фев 2005, 13:52

Уважаемые программисты может кто знает?

У меня есть функция в которую надо передать массив как Variant

в Delphi это делается просто:
var AmpArr:OleVariant;
...
AmpArr:=VarArrayCreate([0,1],varDispatch);
AmpArr[0]:=AmpObjX.DefaultInterface;
AmpArr[1]:=AmpObjY.DefaultInterface;
...
все, переменная создана, значения присвоены

А КАК ЭТО СДЕЛАТЬ В Visual C++ ???

Спасибо
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Начнем с того, что на уровне языка таких вещей как Ole Varaint и Ole Array нет.
Если в дельфи это дело перенесли на уровень языка, это проблема Дельфи.

В Visual C++ это делается вызовами API функций такими как SafeArrayCreate( ), VariantInit() etc
2B OR NOT(2B) = FF
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

В библиотеке MFC есть класс COleVariant и COleSafeArray, но их методы будут отличаться от тех, что в Delphi, поэтому придётся смотреть по ним документацию в MSDN или поискать в сети готовый пример их использования...
Vyacheslav
Сообщения: 11
Зарегистрирован: 27 фев 2005, 13:52

В Visual C++ это делается вызовами API функций такими как SafeArrayCreate( ),
Vyacheslav
Сообщения: 11
Зарегистрирован: 27 фев 2005, 13:52

Спасибо, это помогло. Вот конкретный пример который у меня работает

HRESULT hr;
VARIANT AmpArr;
LPSAFEARRAY safeAmpArr;

safeAmpArr = SafeArrayCreateVectorEx(VT_DISPATCH, 0, 2, LPVOID(&CLSID_AmpObj));
long indexes = 0;
hr = SafeArrayPutElement(safeAmpArr, &indexes, m_spAmpObjX);
indexes = 1;
hr = SafeArrayPutElement(safeAmpArr, &indexes, m_spAmpObjY);
AmpArr.vt = VT_ARRAY|VT_DISPATCH;
AmpArr.parray = safeAmpArr;
//...
hr = SafeArrayDestroyData(safeAmpArr);
.
.
.

double pos1 = 3.5;
double pos2 = 4.7;
LPSAFEARRAY safePosArr;
safePosArr = SafeArrayCreateVector(VT_R8, 0, 2);
indexes = 0;
hr = SafeArrayPutElement(safePosArr, &indexes, &pos1);
indexes = 1;
hr = SafeArrayPutElement(safePosArr, &indexes, &pos2);

VARIANT PosArr;
PosArr.vt = VT_ARRAY|VT_R8;
PosArr.parray = safePosArr;
//...
hr = SafeArrayDestroyData(safePosArr);
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Если использовать библиотеку ATL, то в ней есть аналогичные классы: CComVariant и CComSafeArray. Ещё могут понадобится классы CComBSTR и шаблон CComDispatchDriver.
Vyacheslav
Сообщения: 11
Зарегистрирован: 27 фев 2005, 13:52

Или вот еще можно так (почти как в Delphi)

double* p=new double[2];

p[0]= 40000;

p[1]=20000;

COleSafeArray sa;

sa.CreateOneDim(VT_R8, 2, p);

ASSERT(sa.GetOneDimSize() == 2);

delete []p;
Ответить