Страница 1 из 1

array as variant

Добавлено: 03 апр 2005, 17:37
Vyacheslav
Уважаемые программисты может кто знает?

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

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

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

Спасибо

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

В Visual C++ это делается вызовами API функций такими как SafeArrayCreate( ), VariantInit() etc

Добавлено: 04 апр 2005, 14:43
WinMain
В библиотеке MFC есть класс COleVariant и COleSafeArray, но их методы будут отличаться от тех, что в Delphi, поэтому придётся смотреть по ним документацию в MSDN или поискать в сети готовый пример их использования...

Добавлено: 05 апр 2005, 10:37
Vyacheslav
В Visual C++ это делается вызовами API функций такими как SafeArrayCreate( ),

Добавлено: 05 апр 2005, 10:45
Vyacheslav
Спасибо, это помогло. Вот конкретный пример который у меня работает

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);

Добавлено: 05 апр 2005, 10:48
WinMain
Если использовать библиотеку ATL, то в ней есть аналогичные классы: CComVariant и CComSafeArray. Ещё могут понадобится классы CComBSTR и шаблон CComDispatchDriver.

Добавлено: 05 апр 2005, 11:25
Vyacheslav
Или вот еще можно так (почти как в 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;