Как вернуть из ActiveX-компонента структуру или массив?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

Всем привет!
Подскажите, плиз, как из AnsiString получить BSTR?
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

CComBSTR bstr(ansiString.s_str());
2B OR NOT(2B) = FF
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

Absurd писал(а):CComBSTR bstr(ansiString.s_str());
А вот нет у меня метода s_str() для AnsiString. c_str() есть, а s_str() нет.
Билдер виноват?
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

Сделал вот так:
BSTR bstr = StringToOleStr(AnsiString astr);
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

Можно еще вопросик? :)

Есть класс, у него есть TList _ItemList, элементы у него это *TVehicleInfo.
Тут я читаю поля элемента TList по _Index:

TVehicleInfo *Vehicle = (TVehicleInfo*) _ItemList->Items[_Index];
*Value = StringToOleStr(Vehicle->Name);

Если я сделаю следующей строкой delete Vehicle; то удалиться только моя локальная *Vehicle или удалиться класс, на который ссылается элемент TList[_Index], тоже? Мне кажется, что класс уничтожится тоже...
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Ivan093 писал(а):А вот нет у меня метода s_str() для AnsiString. c_str() есть, а s_str() нет.
Билдер виноват?
Я ошибся. AnsiString.c_str() конечно. Вместо BSTR в C++ нужно использовать CComBSTR, поскольку BSTR нужно выгружать из памяти с помощью SysFreeString, и деструктор CComBSTR с этим справляется.
2B OR NOT(2B) = FF
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

И снова здравствуйте! :cool:
Тут походу работы возник обратный вопрос: как получить данные из 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-объекта, по сути класса?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Посмотри в дебаге поле ObjList.vt. Скорее всего это VT_DISPATCH, вотзможно объединённый с VT_BYREF. Если VT_BYREF присутствует, то используй ObjList.byref и интерпритируй его, как ссылку на то место, где лежит IDispath поинтер. Если VT_BYREF не выставлен, то используй ObjList.punkVal, интерпритируя его, как IDispath поинтер.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Если известен IDispatch, то можно получить список методов и пропертей, пользуясь GetTypeInfoCount и GetTypeInfo, а затем вызвать эти методы или проперти, используя Invoke.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

Romeo писал(а):Если известен IDispatch, то можно получить список методов и пропертей, пользуясь GetTypeInfoCount и GetTypeInfo, а затем вызвать эти методы или проперти, используя Invoke.
Т.е. только через вызовы методом интерфейса можно получить доступ к данным?
Даже несмотря на то, что объект создан в том же коде, в котором его и надо разобрать, просто заполнен он внешней программой (1С)?
Ответить