Страница 6 из 7
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 10 июл 2007, 08:30
Ivan093
Всем привет!
Подскажите, плиз, как из AnsiString получить BSTR?
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 10 июл 2007, 08:40
Absurd
CComBSTR bstr(ansiString.s_str());
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 10 июл 2007, 08:54
Ivan093
Absurd писал(а):CComBSTR bstr(ansiString.s_str());
А вот нет у меня метода s_str() для AnsiString. c_str() есть, а s_str() нет.
Билдер виноват?
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 10 июл 2007, 09:06
Ivan093
Сделал вот так:
BSTR bstr = StringToOleStr(AnsiString astr);
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 10 июл 2007, 09:44
Ivan093
Можно еще вопросик?
Есть класс, у него есть TList _ItemList, элементы у него это *TVehicleInfo.
Тут я читаю поля элемента TList по _Index:
TVehicleInfo *Vehicle = (TVehicleInfo*) _ItemList->Items[_Index];
*Value = StringToOleStr(Vehicle->Name);
Если я сделаю следующей строкой delete Vehicle; то удалиться только моя локальная *Vehicle или удалиться класс, на который ссылается элемент TList[_Index], тоже? Мне кажется, что класс уничтожится тоже...
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 10 июл 2007, 12:54
Absurd
Ivan093 писал(а):А вот нет у меня метода s_str() для AnsiString. c_str() есть, а s_str() нет.
Билдер виноват?
Я ошибся. AnsiString.c_str() конечно. Вместо BSTR в C++ нужно использовать CComBSTR, поскольку BSTR нужно выгружать из памяти с помощью SysFreeString, и деструктор CComBSTR с этим справляется.
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 23 июл 2007, 14:18
Ivan093
И снова здравствуйте!

Тут походу работы возник обратный вопрос: как получить данные из VARIANT (у меня это другой com-объект), который является входящим параметром в методе интерфейса. Поясню:
1. Есть метод интерфейса:
STDMETHODIMP TMapScreenXImpl::SetUserOperations(BSTR UserName,
VARIANT ObjList, VARIANT_BOOL* retVal)
2. ObjList это другой com-объект со своими проперти и методами, заполнялся он примерно так:
ObjList.Add()
ObjList.Field1 = 12345
ObjList.Field2 = "blablabla"
Вот как теперь мне получить данные из этого com-объекта, по сути класса?
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 23 июл 2007, 15:34
Romeo
Посмотри в дебаге поле ObjList.vt. Скорее всего это VT_DISPATCH, вотзможно объединённый с VT_BYREF. Если VT_BYREF присутствует, то используй ObjList.byref и интерпритируй его, как ссылку на то место, где лежит IDispath поинтер. Если VT_BYREF не выставлен, то используй ObjList.punkVal, интерпритируя его, как IDispath поинтер.
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 23 июл 2007, 15:37
Romeo
Если известен IDispatch, то можно получить список методов и пропертей, пользуясь GetTypeInfoCount и GetTypeInfo, а затем вызвать эти методы или проперти, используя Invoke.
Re: Как вернуть из ActiveX-компонента структуру или массив?
Добавлено: 24 июл 2007, 10:33
Ivan093
Romeo писал(а):Если известен IDispatch, то можно получить список методов и пропертей, пользуясь GetTypeInfoCount и GetTypeInfo, а затем вызвать эти методы или проперти, используя Invoke.
Т.е. только через вызовы методом интерфейса можно получить доступ к данным?
Даже несмотря на то, что объект создан в том же коде, в котором его и надо разобрать, просто заполнен он внешней программой (1С)?