Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат параметров при вызове метода, толи глюк, то ли руки крюки 
V
    Опции темы
TROFI
Дата 21.9.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 26.10.2006
Где: ТВЕРЬ

Репутация: нет
Всего: нет



Казалось все просто. Есть COM Server, один из методов которого должен возвращать параметры
Код

STDMETHODIMP TCoSimAlarmServerImpl::GetLastMessage(DATE* pDateTimeAlarm,
  BSTR* pSourceAlarm, BSTR* pEventAlarm, BSTR* pTypeAlarm)
{
  try
  {
   *pDateTimeAlarm = MainForm->DateTimeAlarm;
   *pSourceAlarm = WideString((MainForm->SourceAlarm).c_str()).c_bstr();
   *pEventAlarm = WideString((MainForm->EventAlarm).c_str()).c_bstr();
   *pTypeAlarm = WideString((MainForm->TypeAlarm).c_str()).c_bstr();
  }
  catch (Exception &e)
  {
    return Error(e.Message.c_str(), IID_ICoSimAlarmServer);
  }
  return S_OK;
}


Есть клиент, который вызывает мотод и получает параметры
Код

void __fastcall TMainForm::Button2Click(TObject *Sender)
{
 TDateTime p1;
 WideString p2,p3,p4;
 Serv.OleFunction("GetLastMessage", &p1, &p2, &p3, &p4);
 Label_p1->Caption = p1;
 Label_p2->Caption = p2;
 Label_p3->Caption = p3;
 Label_p4->Caption = p4;
}


Так вот, параметр p1 возвращается корректно, остальные параметры имеют все одинаковое значение (причем равны все значению последнего параметра). Хотя на стороне сервера имеют разные значения в момент вызова метода (проверял)
С технологией COM до этого не имел дело. 

Народ помогите, уже все перепробывал... smile 


Это сообщение отредактировал(а) TROFI - 21.9.2007, 13:24
PM MAIL ICQ   Вверх
TROFI
Дата 23.9.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 26.10.2006
Где: ТВЕРЬ

Репутация: нет
Всего: нет



Народ, ну может быть хоть в COM-СЕРВЕР методе тип BSTR передовал, приведите пример, как правильно принимать это в СОМ-КЛИЕНТЕ по указателю правильно, а то совсем руки опустились.....
PM MAIL ICQ   Вверх
zkv
Дата 23.9.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



TROFI, я плохо знаком с Билдером, но вижу один плохой момент:
методы типа:
Цитата(TROFI @  21.9.2007,  13:21 Найти цитируемый пост)
c_str()

Цитата(TROFI @  21.9.2007,  13:21 Найти цитируемый пост)
c_bstr()

обычно создают временные объекты, ты же получаешь на них указатели, и пытаешься потом ими пользоваться. 
Что именно нужно сделать, не знаю, так как специфики Билдера не знаю.
PM MAIL   Вверх
TROFI
Дата 24.9.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 26.10.2006
Где: ТВЕРЬ

Репутация: нет
Всего: нет



zkv, огромное спасибо за совет. Действительно, ошибка в том, что создавался временный объект. Век живи - век учись блин..... smile 
PM MAIL ICQ   Вверх
TROFI
Дата 24.9.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 26.10.2006
Где: ТВЕРЬ

Репутация: нет
Всего: нет



По моему криво, но работает только так:

Код


 DATE DateTimeAlarm;  
 BSTR SourceAlarm;    
 BSTR EventAlarm;     
 BSTR TypeAlarm;      


STDMETHODIMP TCoSimAlarmServerImpl::GetLastMessage(DATE* pDateTimeAlarm,
  BSTR* pSourceAlarm, BSTR* pEventAlarm, BSTR* pTypeAlarm)
{
  try
  {
   // Промежуточные переменные для формирования результата
   WideString ws_param1,ws_param2,ws_param3;
   BSTR bstr_param1,bstr_param2,bstr_param3;

   // Конвертирование AnsiString в WideString
   ws_param1 = WideString(MainForm->SourceAlarm.c_str());
   ws_param2 = WideString(MainForm->EventAlarm.c_str());
   ws_param3 = WideString(MainForm->TypeAlarm.c_str());

   // Конвертирование WideString в BSTR
   bstr_param1 = ws_param1.c_bstr();
   bstr_param2 = ws_param2.c_bstr();
   bstr_param3 = ws_param3.c_bstr();

   // Сохранение результата для передачи в COM методе
   DateTimeAlarm = MainForm->DateTimeAlarm;
   SourceAlarm = bstr_param1;
   EventAlarm = bstr_param2;
   TypeAlarm = bstr_param3;

   // Дата/Время
   *pDateTimeAlarm = DateTimeAlarm;

   // Источник события
   *pSourceAlarm = SourceAlarm;

   // Тескт события
   *pEventAlarm = EventAlarm;

   // Тип события
   *pTypeAlarm = TypeAlarm;
  }
  catch (Exception &e)
  {
    return Error(e.Message.c_str(), IID_ICoSimAlarmServer);
  }

  return S_OK;
}


тема закрыта....
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0783 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.