Как вернуть из ActiveX-компонента структуру или массив?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 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], тоже? Мне кажется, что класс уничтожится тоже...

Есть класс, у него есть TList _ItemList, элементы у него это *TVehicleInfo.
Тут я читаю поля элемента TList по _Index:
TVehicleInfo *Vehicle = (TVehicleInfo*) _ItemList->Items[_Index];
*Value = StringToOleStr(Vehicle->Name);
Если я сделаю следующей строкой delete Vehicle; то удалиться только моя локальная *Vehicle или удалиться класс, на который ссылается элемент TList[_Index], тоже? Мне кажется, что класс уничтожится тоже...
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Я ошибся. AnsiString.c_str() конечно. Вместо BSTR в C++ нужно использовать CComBSTR, поскольку BSTR нужно выгружать из памяти с помощью SysFreeString, и деструктор CComBSTR с этим справляется.Ivan093 писал(а):А вот нет у меня метода s_str() для AnsiString. c_str() есть, а s_str() нет.
Билдер виноват?
2B OR NOT(2B) = FF
-
- Сообщения: 54
- Зарегистрирован: 28 июн 2007, 13:59
- Откуда: Екатеринбург
- Контактная информация:
И снова здравствуйте! 
Тут походу работы возник обратный вопрос: как получить данные из 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-объекта, по сути класса?

Тут походу работы возник обратный вопрос: как получить данные из 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 54
- Зарегистрирован: 28 июн 2007, 13:59
- Откуда: Екатеринбург
- Контактная информация:
Т.е. только через вызовы методом интерфейса можно получить доступ к данным?Romeo писал(а):Если известен IDispatch, то можно получить список методов и пропертей, пользуясь GetTypeInfoCount и GetTypeInfo, а затем вызвать эти методы или проперти, используя Invoke.
Даже несмотря на то, что объект создан в том же коде, в котором его и надо разобрать, просто заполнен он внешней программой (1С)?