Передача SAFEARRAY в/из COM
Есть 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);
Говорит, что до звездочки должна быть закрывающая скобака, потом точка с запятой.
Что сделано неправильно?
Здравствуйте, 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
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Здравствуйте, 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
Здравствуйте, EM, Вы писали:
EM>Один из вариантов — заворачивать SafeArray в VARIANT
Т.е. если я сделаю примерно так:
VARIANT v1;
v1.vt = VT_SAFEARRAY;
v1.parray=(указатель на мой массив)
И буду передавать Variant, это пройдет?
Re[3]: Передача SAFEARRAY в/из COM
Здравствуйте, 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
Здравствуйте, 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
Здравствуйте, 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
Здравствуйте, EM, Вы писали:
EM>угу.
D>>P.S. А зачем тогда введен VT_SAFEARRAY?
EM>имхо, он веден лично тобою. зачем — не знаю
Хотя, наверное соглашусь, в MSDN написано
VT_SAFEARRAY Indicates a SAFEARRAY. Not valid in a VARIANT.
Re[6]: Передача SAFEARRAY в/из COM
Здравствуйте, 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
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить