![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с DirectX (TDXPlay) [D7, WinXP]
Богдан © (2007-12-04 13:39:00)Я использую объект типа TDXPlay для взаимодействия компьютеров по сети. Все чудно работает, когда этот объект создается в модуле формы основной программы: сессия открывается, сервер создается, другие пользователи присоединяются, сообщения принимаются. НО! Все перестает работать, когда этот объект помещаю в DLL. Нет, сессия также инициализируется без проблем, но процедура OnMessageНЕ ВЫЗЫВАЕТСЯ ! Т.е. объект работает, но почему-то не принимает сообщения. Кто-нибудь может помочь? При необходимости вышлю исходники на e-mail
Slym (2007-12-10 10:19:00) [1]Богдан (10.12.07 9:59) [20]
назначаются процедуры...
А дальше долженбыть цикл выборки сообщений
Сергей М. (2007-12-10 10:10:00) [2]
> запихнул я этот DXPlay в thread - тот же самый эффект
Значит неправильно "запихнул".
Богдан (2007-12-10 09:59:00) [3]В общем, запихнул я этот DXPlay в thread - тот же самый эффект (т.е. сообщения на принимает). Технология такая: DLL создает thread, в модуле thread'а создается DXPlay, назначаются процедуры... все то же самое. Единственное, что работает, так это метод Open - DXPlay инициализируется нормально, подключиться к нему все еще можно, но сообщения он не принимает. Что такое блокирующий ввод/вывод?
Сергей М. (2007-12-10 08:27:00) [4]
> какие могут быть варианты
Альтернативный вариант - блокирующий ввод/вывод
Богдан (2007-12-09 11:00:00) [5]А какие могут быть варианты, если только из Delphi или BCB (мою dll использовать)?
Сергей М. (2007-12-07 14:47:00) [6]Тогда тебе прямая дорога к организации всей этой петрушки в доп.потоке.
Или к отказу от TDXPlay, логику работы которого ты изменить не в силах и не вправе
Богдан (2007-12-07 14:35:00) [7]Да
Сергей М. (2007-12-07 14:11:00) [8]
> Что делать?
Для начала определиться, будет ли твоя dll эксплуатироваться в т.ч. хост-процессами приложений, сверстанных в иных средах разработки (отличных от Делфи и ВСВ)
Богдан (2007-12-07 13:56:00) [9]Да, Сергей, я тоже так думаю. Что делать?
Сергей М. (2007-12-07 09:00:00) [10]
> Рантайм-пакеты библиотека не используют
В таком случае модуль библиотеки и модуль хост-приложения используют разные (каждый свой собственный) объекты Application. В этом и кроется "засада".
Богдан (2007-12-07 08:47:00) [11]Рантайм-пакеты библиотека не используют ни библиотека, на хост-приложение. В опциях проектов (обоих) флажок "Build with runtime packages" отключен - все опции оставлены от установки Delphi (D7) по умолчанию. Попробую сунуть в поток...
Сергей М. (2007-12-06 14:53:00) [12]
> Богдан (06.12.07 14:18) [9]
> Вообще она там не нужна
Ну наконец-то дошли до истины)
Теперь след.вопрос - использует ли твоя библиотека и твое хост-приложение рантайм-пакеты ?
Slym (2007-12-06 14:35:00) [13]Суй в поток...
псевдокод:
TПоток.Execute;
begin
В потоке создаеш DXPLay
стандартный цикл выборки сообщений (while GetMesage do DispatchMessage)
убиваеш DXPLay
end;
Богдан (2007-12-06 14:18:00) [14]Вообще она там не нужна. Но не работает ни с формой, не без нее. Форму я использовал для того, чтобы проверить механизм сообщений (доходят ли они до dll). Похоже, что не доходят, поэтому и DXPLay не чувствует входящих (DX-овых) сообщений
Сергей М. (2007-12-06 11:45:00) [15]
> форма, созданная в dll
Вот я и спрашиваю, зачемона там вообщенужна ?
Богдан (2007-12-06 11:33:00) [16]Компонент TDXPlay создается в run-time, на форму ничего не бросал. Просто в FormCreate вызываю
DXPLay := TDXPlay.create. Но не помогло. Более того: обнаружил странное явление: форма, созданная в dll, вообще не принимает сообщений!. Обнаружил это так: в FormCreate назначаю процедуру обработки сообщений:
Application.OnMessage := AppMessage;
а в процедуре AppMessage просто пихаю ID полученного сообщения в Memo на форме. Так вот, никаких сообщений форма не принимает! Исключение составляет тот момент, когда форма показывает диалоговое окошко ShowMessage: при показанном на экране диалог боксе Memo исправно заполняется сообщениями (опять же, только от окошка сообщения). В общем, проблема видится мне в том, то форма, созданная в dll, почему-то не принимает сообщений (как-бы не является приложением, что-ли...) :(
Сергей М. (2007-12-05 10:18:00) [17]
> я в dll специально включил форму
Зачем ?
Только для того чтобы было куда-то "бросить" компонент TDXPlay ?
Rouse_ (2007-12-04 21:36:00) [18]ЦВС без окна?
Богдан (2007-12-04 14:59:00) [19]Коллеги, я в dll специальновключил форму, она корректно отзывается извне dll. Но сообщения DXPLay'ем по-прежнему не принимаются. Может, дело в какой-нибудь глобальной регистрации этого DXPLay'я как приемщика сообщений? И, если все-таки отлавливать сообщения, то какие именно (в смысле, на какие сообщения реагировать)?
umbra (2007-12-04 14:25:00) [20]
> при чем тут dll?
даже если у потока есть цикл выборки сообщений, то как он узнает, что, получив вот_это_конкретное_сообщение, надо отправить его динамически загруженной длл? И как она его получит?