Страница 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;