C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
передача void* на СОМ-сервер
Benish
Отправлено: 24.02.2005, 13:33


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Пытаюсь передать void* в функцию СОМ-сервера, получаю EOleSysError "Неверный тип переменной"

Идея такова. Хочу передавать адрес на структуру на СОМ сервер, а там ее заполнять.
Решил передовать адрес структуры, как void*, а на сервере преобразовывать в нужный тип.
Создал у СОМ сервера функцию Receive, возвращаемый тип: HRESULT, параметры: Name — Packet, Type — void *, Modifer [out]. Обработчик функии пустой, просто стоит return S_OK.

В клиенте пишу:
CODE

Serv.OleProcedure("Receive", (void*)&R);



Все компилируется, запускается, но при обращении к серверу, получаю EOleSysError — "Неверный тип переменной".

И еще такой вопрос:
Есть СОМ сервер. К нему подключено 2 клиента. Данные с СОМ сервера идут потоком пакетов.
Приблизительно 1 пакет в секунду. Как узнать, отправлялся ли пакет данному клиенту?
Или нужно пойти от обратного и с сервера, отдавать клиенту пакет с меткой времени, а клиент уже сам будет смотреть, новый это пакет или нет.

Подскажите пожалуйста.
AVC
Отправлено: 24.02.2005, 14:12


Ветеран

Группа: Модератор
Сообщений: 1583



Даже передав указатель (например приведя его к int) как вы собираетесь его использовать в адресном пространстве другого процесса. Так не выйдет.
Benish
Отправлено: 24.02.2005, 14:43


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Хм, проблема в том, что это не работает только для void*.
Имея на сервере процедуру:

CODE

STDMETHODIMP TMyObjectImpl::Receive(int* Packet)
{
  *Packet = 31373;
   return S_OK;
}



а у клиента:

CODE

void __fastcall TForm1::Button2Click(TObject *Sender)
{
   int R;
   Serv.OleProcedure("Receive", &R);
   Edit1->Text = R;
}



Мы чудесненько в Edit1->Text получаем число: 31373.

А вот с void* ничего не получается. Причем видимо это проблема именно из за void*.
Guest
Отправлено: 18.03.2005, 13:33


Не зарегистрирован







QUOTE
biggrin.gif Мы чудесненько в Edit1->Text получаем число: 31373.

Да кстати чудесненько — это от слова чудо !

я бы не надеялся на такую вот хреновину
намаялся в свое время с вордом теперь вот с автокадом таже песня...
по идее для инта может это дело и прокатит ну проверь на другой машине хотя бы с другой операционкой т.е. даже просто с другого установочного диска может быть удивишься.
вообщето для COM предлагают Variant — ух и сильно закрученная фигня я скажу — но если разобраться — то покрайней мере честно работать все будет — попробуй.

там такая фигня — (ну для строк покрайней мере)
надо выделить память — ее передать на сервер — он ее сам должен удалить при этом клиент также при получении String должен очистить память так как заведомо известно что сервер ее не очистит.
Microsoft — за этим следит точно — все остальные подстраиваются...
и как то им в голову не приходило передавать указатели — почему ?
Это ведь так просто ???

если все детище твое может быть просто подумать над DLL ??
Guest
Отправлено: 18.03.2005, 13:39


Не зарегистрирован







Хотя вот посмотрел работает
Это сервер

STDMETHODIMP TPrintLgipImpl::GetNovellKontekst(BSTR* Value)
{
try{
*Value = (WideString)Form1->NovellKontekst;
}catch(...)
{return S_FALSE;}
return S_OK;
}
Konstantine
Отправлено: 29.03.2005, 16:56


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE (Benish @ 24/02/2005, 14:43)
Мы чудесненько в Edit1->Text получаем число: 31373.

радуйтесь — Randomize улыбнулся Вам

Отредактировано Konstantine — 29/03/2005, 16:57

Вернуться в Технологии COM/DCOM, ActiveX