COM & variant
От: sshurov  
Дата: 13.07.04 17:33
Оценка:
добрый день уважаемые,


поправьте если не прав —

скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр
переменную типа массив record-ов; значит я должен в методе тип параметра указать
как VARIANT, а внутри метода привести его к моему типу?

если прав-не-прав — бросьте примером... чтото туплю со старшной силой...


спасибо.
Re: COM & variant
От: Ovl Россия  
Дата: 13.07.04 17:55
Оценка:
Здравствуйте, sshurov, Вы писали:

S>добрый день уважаемые,

S>поправьте если не прав -
S>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр
S>переменную типа массив record-ов; значит я должен в методе тип параметра указать
S>как VARIANT, а внутри метода привести его к моему типу?
S>если прав-не-прав — бросьте примером... чтото туплю со старшной силой...
S>спасибо.

может удобнее воспользоваться SAFEARRAY?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: COM & variant
От: sshurov  
Дата: 13.07.04 18:33
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>Здравствуйте, sshurov, Вы писали:


S>>добрый день уважаемые,

S>>поправьте если не прав -
S>>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр
S>>переменную типа массив record-ов; значит я должен в методе тип параметра указать
S>>как VARIANT, а внутри метода привести его к моему типу?
S>>если прав-не-прав — бросьте примером... чтото туплю со старшной силой...
S>>спасибо.

Ovl>может удобнее воспользоваться SAFEARRAY


а! о! плин! видимо я ослеп слегка
щас гляну, спасибо!
Re[2]: COM & variant
От: sshurov  
Дата: 13.07.04 18:37
Оценка:
Здравствуйте, 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>чего не так делаю?


а как ты делаешь? Напиши кусок кода, оценим, поправим.
Re[2]: COM & variant
От: Ionich  
Дата: 14.07.04 07:20
Оценка:
Здравствуйте, Ovl, Вы писали:

S>>добрый день уважаемые,

S>>поправьте если не прав -
S>>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр
S>>переменную типа массив record-ов; значит я должен в методе тип параметра указать
S>>как VARIANT, а внутри метода привести его к моему типу?
S>>если прав-не-прав — бросьте примером... чтото туплю со старшной силой...
S>>спасибо.

Ovl>может удобнее воспользоваться SAFEARRAY?


А еще лучше в VARIANT упаковать SAFEARRAY, а в этот SAFEARRAY уже твой массив структур.
Re[3]: COM & variant
От: dead_ricky  
Дата: 14.07.04 09:04
Оценка:
Здравствуйте, 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)
{
      // убедимся что получили массив типа long
      if ((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
}
Re[4]: COM & variant
От: Vi2 Удмуртия http://www.adem.ru
Дата: 14.07.04 10:01
Оценка:
Здравствуйте, dead_ricky, Вы писали:

d_r>Вот, из книги Э.Трельсена:

d_r>      // убедимся что получили массив типа long
d_r>      if ((theArray.vt & VT_I4) && (theArray.vt & VT_ARRAY))

Несмотря на то, что это из Трельсена, это не верно: VT_I4 — это не БИТОВОЕ поле. Оно равно 3, так что массив, в котором установлены 1-ый и 2-ой биты, будет считаться целым, хотя содержать может все что угодно. Например, массив VARIANTов или объектов.
      // убедимся что получили массив типа long
      if( (theArray.vt & VT_ARRAY) != 0 && (theArray.vt & VT_TYPEMASK) == VT_I4 )
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: COM & variant
От: A_l_e_x_e_y Россия  
Дата: 14.07.04 13:24
Оценка:
Здравствуйте, sshurov, Вы писали:
S>скажем есть у меня СОМ-объект и мне надо передать в этот метод как параметр
S>переменную типа массив record-ов; значит я должен в методе тип параметра указать
S>как VARIANT, а внутри метода привести его к моему типу?
на самом деле сом сам по себе не ограничивает тип параметра. Если ограничение есть, то это значит, что у тебя дисп интерфейс. А если нет необходимости использовать свой обьект в VB, то можно использовать обычные интерфейсы, что несколько удобнее.
... << Rsdn@Home 1.1.4 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.