на главнуюВсе эхи RU.CBUILDER
войти ?

Re: Передача данных TClientDataset через стандартные потоки

От Dmytry Ginzburg (2:461/48.125) к Vladimir Ulchenko

В ответ на Заголовок предыдущего сообщения в треде (Имя Автора)


Здравствуйте, о моногоуважаемый(ая), Vladimir!
Вот.. Hабил письмецо.. А вот, что из этого вышло:

Как-то, Пятница, Сентябрь 18 2009, в 16:02, Vladimir Ulchenko приехал к Dmytry Ginzburg на белом лимузине, да как заорёт _"Re: Передача данных TClientDataset через стандартные потоки"_

VU> From: "Vladimir Ulchenko" <vavan@santel.ru>

VU> Hello, Dmytry!
VU> You wrote to All on Sun, 13 Sep 2009 00:35:09 +0400:

DG>> поток ввода/вывода некорректно передаётся символ завершения датасета. В
DG>> связи с

VU> не понял что значит "символ завершения датасета"

Объясняю ситуацию. Я делаю ClientDataSet->SaveToStream(...). Потом беру этот стрим и побайтно кидаю в базовый поток вывода cout. А на другой стороне у меня сидит другая программа, которая принимает его на пайп. Через пайп проходит ровно такое количество байтов, которое и должно, но то, что я получил из пайпа, я не могу загрузить в датасет, т.к. получаю ошибку Datatype mismatch или что-то в этом роде. Я прошёлся отладчиком и обнаружил, что эту ошибку возвращает интерфейс датасета при параметре FProviderEof=true. И тогда я предположил, что дело именно в этом символе Eof, который некорректно прошёл через пайп. Hо вот что с этим сделать ума не приложу. Кстати, я пытался идти и другим путём: создать сервер приложения и общаться с ним через COM. Hо и тут я потерпел неудачу. Сначала была проблема, что при создании консольного проекта, билдер не подключает к нему bpf-файл, хотя и создаёт его, в результате чего объект _Module не создавался. Эту проблему я решил переносом всех описаний файла bpf в файл cpp, где у меня находиться функция WinMain. Hо теперь возникла проблема, как правильно реализовать WinMain при потоковой модели Free. Поскольку судя по исходникам ATL вся инициализация фабрики класса COM-объекта происходит внутри конструктора объекта _Module, то я решил следовать книге Дональда Бокса и реализовать внутри WinMain функцию WaitForSingleObject(hEvent); где hEvent - дескриптор события, которое статически инициализируется, а устанавливается в деструкторе COM-объекта (когда от него отвалились все клиенты). Я зарегистрировал этот сервер, но к нему не может подключиться ни один клиент. При попытке сделать DComConnection->Connect(); или DComConnection->GetAppServer() клиент намертво подвисает. Я попробовал также повесить внутри WinMain петлю сообщений, но это не помогло. Клиенты намертво подвисают и что делать не знаю. Так что буду очень рад, если Вы меня просветите.

Желаю Вам всего наилучшего, Vladimir.Дмитрий.

--- Вот такой вот наглый Дед со стажем в 3.0.1-asa9 SR1 лет!
* Origin: Default ORIGIN (FidoNet 2:461/48.125)

Ответы на это письмо:

From: Username
Заголовок следующего сообщения в треде может быть длинным и его придется перенести на новую строку

From: Username
Или коротким

FGHI-url этого письма: area://RU.CBUILDER?msgid=2:461/48.125@FidoNet+4ab431a1