-
Я использую объект типа TDXPlay для взаимодействия компьютеров по сети. Все чудно работает, когда этот объект создается в модуле формы основной программы: сессия открывается, сервер создается, другие пользователи присоединяются, сообщения принимаются. НО! Все перестает работать, когда этот объект помещаю в DLL. Нет, сессия также инициализируется без проблем, но процедура OnMessage НЕ ВЫЗЫВАЕТСЯ ! Т.е. объект работает, но почему-то не принимает сообщения. Кто-нибудь может помочь? При необходимости вышлю исходники на e-mail
-
> процедура OnMessage НЕ ВЫЗЫВАЕТСЯ ! Т.е. объект работает, > но почему-то не принимает сообщения.
потому что в длл нет окна и никакие сообщения никто не принимает. К сети это отношения не имеет.
> Кто-нибудь может помочь?
помочь может только создание цикла выборки оконных сообщений в длл
-
простите, но разве цикл выборки сообщений относится не к потоку? при чем тут dll?
-
> при чем тут dll?
даже если у потока есть цикл выборки сообщений, то как он узнает, что, получив вот_это_конкретное_сообщение, надо отправить его динамически загруженной длл? И как она его получит?
-
Коллеги, я в dll специально включил форму, она корректно отзывается извне dll. Но сообщения DXPLay'ем по-прежнему не принимаются. Может, дело в какой-нибудь глобальной регистрации этого DXPLay'я как приемщика сообщений? И, если все-таки отлавливать сообщения, то какие именно (в смысле, на какие сообщения реагировать)?
-
ЦВС без окна?
-
> я в dll специально включил форму
Зачем ? Только для того чтобы было куда-то "бросить" компонент TDXPlay ?
-
Компонент TDXPlay создается в run-time, на форму ничего не бросал. Просто в FormCreate вызываю DXPLay := TDXPlay.create . Но не помогло. Более того: обнаружил странное явление: форма, созданная в dll, вообще не принимает сообщений!. Обнаружил это так: в FormCreate назначаю процедуру обработки сообщений: Application.OnMessage := AppMessage; а в процедуре AppMessage просто пихаю ID полученного сообщения в Memo на форме. Так вот, никаких сообщений форма не принимает! Исключение составляет тот момент, когда форма показывает диалоговое окошко ShowMessage: при показанном на экране диалог боксе Memo исправно заполняется сообщениями (опять же, только от окошка сообщения). В общем, проблема видится мне в том, то форма, созданная в dll, почему-то не принимает сообщений (как-бы не является приложением, что-ли...) :(
-
> форма, созданная в dll
Вот я и спрашиваю, зачем она там вообще нужна ?
-
Вообще она там не нужна. Но не работает ни с формой, не без нее. Форму я использовал для того, чтобы проверить механизм сообщений (доходят ли они до dll). Похоже, что не доходят, поэтому и DXPLay не чувствует входящих (DX-овых) сообщений
-
Суй в поток... псевдокод:
TПоток.Execute;
begin
В потоке создаеш DXPLay
стандартный цикл выборки сообщений (while GetMesage do DispatchMessage)
убиваеш DXPLay
end;
-
> Богдан (06.12.07 14:18) [9]
> Вообще она там не нужна
Ну наконец-то дошли до истины)
Теперь след.вопрос - использует ли твоя библиотека и твое хост-приложение рантайм-пакеты ?
-
Рантайм-пакеты библиотека не используют ни библиотека, на хост-приложение. В опциях проектов (обоих) флажок "Build with runtime packages" отключен - все опции оставлены от установки Delphi (D7) по умолчанию. Попробую сунуть в поток...
-
> Рантайм-пакеты библиотека не используют
В таком случае модуль библиотеки и модуль хост-приложения используют разные (каждый свой собственный) объекты Application. В этом и кроется "засада".
-
Да, Сергей, я тоже так думаю. Что делать?
-
> Что делать?
Для начала определиться, будет ли твоя dll эксплуатироваться в т.ч. хост-процессами приложений, сверстанных в иных средах разработки (отличных от Делфи и ВСВ)
-
Да
-
Тогда тебе прямая дорога к организации всей этой петрушки в доп.потоке. Или к отказу от TDXPlay, логику работы которого ты изменить не в силах и не вправе
-
А какие могут быть варианты, если только из Delphi или BCB (мою dll использовать)?
-
> какие могут быть варианты
Альтернативный вариант - блокирующий ввод/вывод
-
В общем, запихнул я этот DXPlay в thread - тот же самый эффект (т.е. сообщения на принимает). Технология такая: DLL создает thread, в модуле thread'а создается DXPlay, назначаются процедуры... все то же самое. Единственное, что работает, так это метод Open - DXPlay инициализируется нормально, подключиться к нему все еще можно, но сообщения он не принимает. Что такое блокирующий ввод/вывод?
-
> запихнул я этот DXPlay в thread - тот же самый эффект
Значит неправильно "запихнул".
-
Богдан (10.12.07 9:59) [20] назначаются процедуры... А дальше долженбыть цикл выборки сообщений
|