скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр
переменную типа массив record-ов; значит я должен в методе тип параметра указать
как VARIANT, а внутри метода привести его к моему типу?
если прав-не-прав — бросьте примером... чтото туплю со старшной силой...
Здравствуйте, sshurov, Вы писали:
S>добрый день уважаемые, S>поправьте если не прав - S>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр S>переменную типа массив record-ов; значит я должен в методе тип параметра указать S>как VARIANT, а внутри метода привести его к моему типу? S>если прав-не-прав — бросьте примером... чтото туплю со старшной силой... S>спасибо.
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, sshurov, Вы писали:
S>>добрый день уважаемые, S>>поправьте если не прав - S>>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр S>>переменную типа массив record-ов; значит я должен в методе тип параметра указать S>>как VARIANT, а внутри метода привести его к моему типу? S>>если прав-не-прав — бросьте примером... чтото туплю со старшной силой... S>>спасибо.
Ovl>может удобнее воспользоваться SAFEARRAY
а! о! плин! видимо я ослеп слегка
щас гляну, спасибо!
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, sshurov, Вы писали:
S>>добрый день уважаемые, S>>поправьте если не прав - S>>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр S>>переменную типа массив record-ов; значит я должен в методе тип параметра указать S>>как VARIANT, а внутри метода привести его к моему типу? S>>если прав-не-прав — бросьте примером... чтото туплю со старшной силой... S>>спасибо.
Ovl>может удобнее воспользоваться SAFEARRAY?
или опять не вижу или чего — мой мсдн говорит что SAFEARRAY это к Windows CE,
а копмпилятор ругается что нельзя использовать void или void*
чего не так делаю?
Re[3]: COM & variant
От:
Аноним
Дата:
14.07.04 07:09
Оценка:
Здравствуйте, sshurov, Вы писали:
S>чего не так делаю?
а как ты делаешь? Напиши кусок кода, оценим, поправим.
Здравствуйте, Ovl, Вы писали:
S>>добрый день уважаемые, S>>поправьте если не прав - S>>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр S>>переменную типа массив record-ов; значит я должен в методе тип параметра указать S>>как VARIANT, а внутри метода привести его к моему типу? S>>если прав-не-прав — бросьте примером... чтото туплю со старшной силой... S>>спасибо.
Ovl>может удобнее воспользоваться SAFEARRAY?
А еще лучше в VARIANT упаковать SAFEARRAY, а в этот SAFEARRAY уже твой массив структур.
Здравствуйте, sshurov, Вы писали:
S>Здравствуйте, Ovl, Вы писали:
Ovl>>Здравствуйте, sshurov, Вы писали:
S>>>добрый день уважаемые, S>>>поправьте если не прав - S>>>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр S>>>переменную типа массив record-ов; значит я должен в методе тип параметра указать S>>>как VARIANT, а внутри метода привести его к моему типу? S>>>если прав-не-прав — бросьте примером... чтото туплю со старшной силой... S>>>спасибо.
Ovl>>может удобнее воспользоваться SAFEARRAY?
S>или опять не вижу или чего — мой мсдн говорит что SAFEARRAY это к Windows CE, S>а копмпилятор ругается что нельзя использовать void или void*
S>чего не так делаю?
Вот, из книги Э.Трельсена:
STDMETHODIMP CSomeClass::Somemethod(/*[in]*/ VARIANT theArray)
{
// убедимся что получили массив типа longif ((theArray.vt & VT_I4) && (theArray.vt & VT_ARRAY))
{
SAFEARRAY* pSA = theArray.parray;
long lBound;
long uBound;
SafeArrayGetUBound(pSA, 1, &uBound);
SafeArrayGetLBound(pSA, 1, &lBound);
long item;
for (long j = lBound; j <= uBound; j++)
{
// получаем значение елемента массива
SafeArrayGetElement(pSA, &j, &item);
// делаем что-нибудь с item'ом
}
}
return S_OK
}
Здравствуйте, dead_ricky, Вы писали:
d_r>Вот, из книги Э.Трельсена:
d_r> // убедимся что получили массив типа long
d_r> if ((theArray.vt & VT_I4) && (theArray.vt & VT_ARRAY))
Несмотря на то, что это из Трельсена, это не верно: VT_I4 — это не БИТОВОЕ поле. Оно равно 3, так что массив, в котором установлены 1-ый и 2-ой биты, будет считаться целым, хотя содержать может все что угодно. Например, массив VARIANTов или объектов.
// убедимся что получили массив типа longif( (theArray.vt & VT_ARRAY) != 0 && (theArray.vt & VT_TYPEMASK) == VT_I4 )
Здравствуйте, sshurov, Вы писали: S>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр S>переменную типа массив record-ов; значит я должен в методе тип параметра указать S>как VARIANT, а внутри метода привести его к моему типу?
на самом деле сом сам по себе не ограничивает тип параметра. Если ограничение есть, то это значит, что у тебя дисп интерфейс. А если нет необходимости использовать свой обьект в VB, то можно использовать обычные интерфейсы, что несколько удобнее.