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 | Мы чудесненько в 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
|
|