Передача SAFEARRAY в/из COM
От: Defenseur  
Дата: 24.06.03 13:41
Оценка:
Есть attributed COM-компонент.

Объявляю в интерфейсе следующий метод:

[id(1), helpstring("method Test1")] HRESULT Test1([in] int Param1, [out,retval] SAFEARRAY(int) * Res);


А в классе:

STDMETHOD(Test1)(int Param1, SAFEARRAY * Res);


Компилятор ругается на первую строчку:
[id(1), helpstring("method Test1")] HRESULT Test1([in] int Param1, [out,retval] SAFEARRAY(int) * Res);

Говорит, что до звездочки должна быть закрывающая скобака, потом точка с запятой.

Что сделано неправильно?
Re: satype
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.06.03 13:59
Оценка: 3 (1)
Здравствуйте, Defenseur, Вы писали:

D>Есть attributed COM-компонент.
D>Объявляю в интерфейсе следующий метод:

D>[id(1), helpstring("method Test1")] HRESULT Test1([in] int Param1, [out,retval] SAFEARRAY(int) * Res);

Должен быть указан тип элементов в специальном атрибуте — satype. [out,retval,satype(int)] SAFEARRAY* * Res
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Передача SAFEARRAY в/из COM
От: EM Великобритания  
Дата: 24.06.03 14:08
Оценка:
Один из вариантов — заворачивать SafeArray в VARIANT
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[2]: satype
От: Defenseur  
Дата: 24.06.03 14:15
Оценка:
Здравствуйте, Vi2, Вы писали:

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


Vi2>

D>>Есть attributed COM-компонент.
D>>Объявляю в интерфейсе следующий метод:
Vi2>

D>>[id(1), helpstring("method Test1")] HRESULT Test1([in] int Param1, [out,retval] SAFEARRAY(int) * Res);
Vi2>

Vi2>Должен быть указан тип элементов в специальном атрибуте — satype. [out,retval,satype(int)] SAFEARRAY* * Res

А можно чуточку подробнее. Т.е. строка объявления полностью, а то я пишу:

[id(1), helpstring("method Test1")] HRESULT Test1([in] int Param1, [out,retval,satype(int)] SAFEARRAY * Res);


Так вылетает с ошибкой что не может преобразовать SAFEARRAY в SAFEARRAY **
Re[2]: Передача SAFEARRAY в/из COM
От: Defenseur  
Дата: 24.06.03 14:20
Оценка:
Здравствуйте, EM, Вы писали:


EM>Один из вариантов — заворачивать SafeArray в VARIANT


Т.е. если я сделаю примерно так:

VARIANT v1;

v1.vt = VT_SAFEARRAY;
v1.parray=(указатель на мой массив)


И буду передавать Variant, это пройдет?
Re[3]: Передача SAFEARRAY в/из COM
От: rihter Россия http://rihter.slash-x.net
Дата: 24.06.03 14:26
Оценка: 3 (1)
Здравствуйте, Defenseur, Вы писали:

EM>>Один из вариантов — заворачивать SafeArray в VARIANT

D>Т.е. если я сделаю примерно так:

D>
D>VARIANT v1;

D>v1.vt = VT_SAFEARRAY;
D>v1.parray=(указатель на мой массив)
D>


надо
v1.vt = VT_ARRAY | VT_I4;//или как какой тип передаешь


D>И буду передавать Variant, это пройдет?

должно
Re[3]: Передача SAFEARRAY в/из COM
От: EM Великобритания  
Дата: 24.06.03 14:27
Оценка: 3 (1)
Здравствуйте, Defenseur, Вы писали:

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



EM>>Один из вариантов — заворачивать SafeArray в VARIANT


D>Т.е. если я сделаю примерно так:


D>
D>VARIANT v1;

D>v1.vt = VT_SAFEARRAY;
D>v1.parray=(указатель на мой массив)
D>


D>И буду передавать Variant, это пройдет?




НЕт не пройдет, т.к. VARIANT не знает слова VT_SAFEARRAY

Пройдет вот так :
VARIANT vtParam;
vtParam.vt = VT_ARRAY | VT_BSTR;
vtParam.parray = pSa;

Есс-но если у тебя SAFEARRAY BSTR — ов
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[4]: Передача SAFEARRAY в/из COM
От: Defenseur  
Дата: 24.06.03 14:33
Оценка:
Здравствуйте, EM, Вы писали:

EM>НЕт не пройдет, т.к. VARIANT не знает слова VT_SAFEARRAY


EM>Пройдет вот так :

EM>VARIANT vtParam;
EM>vtParam.vt = VT_ARRAY | VT_BSTR;
EM>vtParam.parray = pSa;

EM>Есс-но если у тебя SAFEARRAY BSTR — ов


Надеюсь слово VT_VARIANT он знает?

vtParam.vt = VT_ARRAY | VT_VARIANT;

Т.е. эта запись корректна?

P.S. А зачем тогда введен VT_SAFEARRAY?
Re[5]: Передача SAFEARRAY в/из COM
От: EM Великобритания  
Дата: 24.06.03 14:37
Оценка:
D>Надеюсь слово VT_VARIANT он знает?



D>
D>vtParam.vt = VT_ARRAY | VT_VARIANT;
D>

D>Т.е. эта запись корректна?

угу.

D>P.S. А зачем тогда введен VT_SAFEARRAY?


имхо, он веден лично тобою. зачем — не знаю
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[6]: Передача SAFEARRAY в/из COM
От: Defenseur  
Дата: 24.06.03 14:42
Оценка:
Здравствуйте, EM, Вы писали:



D>>Надеюсь слово VT_VARIANT он знает?




D>>
D>>vtParam.vt = VT_ARRAY | VT_VARIANT;
D>>

D>>Т.е. эта запись корректна?

EM>угу.


D>>P.S. А зачем тогда введен VT_SAFEARRAY?


EM>имхо, он веден лично тобою. зачем — не знаю


Да не, я его точно не вводил , просто на одном из VT_XXX нажал на go to definition и пришел к файлу ks.h

Его кусок:


enum VARENUM {
    VT_EMPTY = 0,
    VT_NULL = 1,
    VT_I2 = 2,
...
    VT_SAFEARRAY = 27,
    VT_CARRAY = 28,
    VT_USERDEFINED = 29,
...
    VT_ARRAY = 0x2000,
    VT_BYREF = 0x4000,
...
};
#endif // _NTDDK_ && !__wtypes_h__
Re[6]: Передача SAFEARRAY в/из COM
От: Defenseur  
Дата: 24.06.03 14:47
Оценка:
Здравствуйте, EM, Вы писали:

EM>угу.


D>>P.S. А зачем тогда введен VT_SAFEARRAY?


EM>имхо, он веден лично тобою. зачем — не знаю


Хотя, наверное соглашусь, в MSDN написано

VT_SAFEARRAY Indicates a SAFEARRAY. Not valid in a VARIANT.
Re[6]: Передача SAFEARRAY в/из COM
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.06.03 14:49
Оценка:
Здравствуйте, EM, Вы писали:

D>>P.S. А зачем тогда введен VT_SAFEARRAY?
EM>имхо, он веден лично тобою. зачем — не знаю

Этот тип может появиться только при описании типов в библиотеке типов. Это, к тому же, наследие прошлых времен.

тип XXX описывается в библиотеке типов как VT_XXX.
тип XXX* описывается в библиотеке типов как сначала VT_PTR, а потом VT_XXX.
тип XXX** описывается в библиотеке типов как сначала VT_PTR, потом VT_PTR и, наконец, VT_XXX.
тип SAFEARRAY(XXX) описывается в библиотеке типов как сначала VT_SAFEARRAY, а потом VT_XXX.
тип SAFEARRAY(XXX)* описывается в библиотеке типов как сначала VT_PTR, потом VT_SAFEARRAY и, наконец, VT_XXX.

PS
Интересный (компилируемы, имеющий все права, но не рабочий) эффект дает SAFEARRAY(SAFEARRAY(XXX))* pBadParam. Особенно прикольно глядеть на VB.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.