Конференция "Сети" » проблема с DirectX (TDXPlay) [D7, WinXP]
 
  • Богдан (04.12.07 13:39) [0]
    Я использую объект типа TDXPlay для взаимодействия компьютеров по сети. Все чудно работает, когда этот объект создается в модуле формы основной программы: сессия открывается, сервер создается, другие пользователи присоединяются, сообщения принимаются. НО! Все перестает работать, когда этот объект помещаю в DLL. Нет, сессия также инициализируется без проблем, но процедура OnMessage НЕ ВЫЗЫВАЕТСЯ ! Т.е. объект работает, но почему-то не принимает сообщения. Кто-нибудь может помочь? При необходимости вышлю исходники на e-mail
  • umbra © (04.12.07 13:46) [1]

    > процедура OnMessage НЕ ВЫЗЫВАЕТСЯ ! Т.е. объект работает,
    >  но почему-то не принимает сообщения.


    потому что в длл нет окна и никакие сообщения никто не принимает. К сети это отношения не имеет.


    > Кто-нибудь может помочь?

    помочь может только создание цикла выборки оконных сообщений в длл
  • MetalFan © (04.12.07 14:11) [2]
    простите, но разве цикл выборки сообщений относится не к потоку?
    при чем тут dll?
  • umbra © (04.12.07 14:25) [3]

    > при чем тут dll?

    даже если у потока есть цикл выборки сообщений, то как он узнает, что, получив вот_это_конкретное_сообщение, надо отправить его динамически загруженной длл? И как она его получит?
  • Богдан (04.12.07 14:59) [4]
    Коллеги, я в dll специально включил форму, она корректно отзывается извне dll. Но сообщения DXPLay'ем по-прежнему не принимаются. Может, дело в какой-нибудь глобальной регистрации этого DXPLay'я как приемщика сообщений? И, если все-таки отлавливать сообщения, то какие именно (в смысле, на какие сообщения реагировать)?
  • Rouse_ © (04.12.07 21:36) [5]
    ЦВС без окна?
  • Сергей М. © (05.12.07 10:18) [6]

    > я в dll специально включил форму


    Зачем ?
    Только для того чтобы было куда-то "бросить" компонент TDXPlay ?
  • Богдан (06.12.07 11:33) [7]
    Компонент TDXPlay создается в run-time, на форму ничего не бросал. Просто в FormCreate вызываю
    DXPLay := TDXPlay.create

    . Но не помогло. Более того: обнаружил странное явление: форма, созданная в dll, вообще не принимает сообщений!. Обнаружил это так: в FormCreate назначаю процедуру обработки сообщений:
    Application.OnMessage := AppMessage;


    а в процедуре AppMessage просто пихаю ID полученного сообщения в Memo на форме. Так вот, никаких сообщений форма не принимает! Исключение составляет тот момент, когда форма показывает диалоговое окошко ShowMessage: при показанном на экране диалог боксе Memo исправно заполняется сообщениями (опять же, только от окошка сообщения). В общем, проблема видится мне в том, то форма, созданная в dll, почему-то не принимает сообщений (как-бы не является приложением, что-ли...)  :(
  • Сергей М. © (06.12.07 11:45) [8]

    > форма, созданная в dll


    Вот я и спрашиваю, зачем она там вообще нужна ?
  • Богдан (06.12.07 14:18) [9]
    Вообще она там не нужна. Но не работает ни с формой, не без нее. Форму я использовал для того, чтобы проверить механизм сообщений (доходят ли они до dll). Похоже, что не доходят, поэтому и DXPLay не чувствует входящих (DX-овых) сообщений
  • Slym © (06.12.07 14:35) [10]
    Суй в поток...
    псевдокод:


    TПоток.Execute;
    begin
    В потоке создаеш DXPLay
    стандартный цикл выборки сообщений (while GetMesage do DispatchMessage)
    убиваеш DXPLay
    end;

  • Сергей М. © (06.12.07 14:53) [11]

    > Богдан   (06.12.07 14:18) [9]


    > Вообще она там не нужна


    Ну наконец-то дошли до истины)

    Теперь след.вопрос - использует ли твоя библиотека и твое хост-приложение рантайм-пакеты ?
  • Богдан (07.12.07 08:47) [12]
    Рантайм-пакеты библиотека не используют ни библиотека, на хост-приложение. В опциях проектов (обоих) флажок "Build with runtime packages" отключен - все опции оставлены от установки Delphi (D7) по умолчанию. Попробую сунуть в поток...
  • Сергей М. © (07.12.07 09:00) [13]

    > Рантайм-пакеты библиотека не используют


    В таком случае модуль библиотеки и модуль хост-приложения используют разные (каждый свой собственный) объекты Application. В этом и кроется "засада".
  • Богдан (07.12.07 13:56) [14]
    Да, Сергей, я тоже так думаю. Что делать?
  • Сергей М. © (07.12.07 14:11) [15]

    > Что делать?


    Для начала определиться, будет ли твоя dll эксплуатироваться в т.ч. хост-процессами приложений, сверстанных в иных средах разработки (отличных от Делфи и ВСВ)
  • Богдан (07.12.07 14:35) [16]
    Да
  • Сергей М. © (07.12.07 14:47) [17]
    Тогда тебе прямая дорога к организации всей этой петрушки в доп.потоке.
    Или к отказу от TDXPlay, логику работы которого ты изменить не в силах и не вправе
  • Богдан (09.12.07 11:00) [18]
    А какие могут быть варианты, если только из Delphi или BCB (мою dll использовать)?
  • Сергей М. © (10.12.07 08:27) [19]

    > какие могут быть варианты


    Альтернативный вариант - блокирующий ввод/вывод
  • Богдан (10.12.07 09:59) [20]
    В общем, запихнул я этот DXPlay в thread - тот же самый эффект (т.е. сообщения на принимает). Технология такая: DLL создает thread, в модуле thread'а создается DXPlay, назначаются процедуры... все то же самое. Единственное, что работает, так это метод Open - DXPlay инициализируется нормально, подключиться к нему все еще можно, но сообщения он не принимает. Что такое блокирующий ввод/вывод?
  • Сергей М. © (10.12.07 10:10) [21]

    > запихнул я этот DXPlay в thread - тот же самый эффект


    Значит неправильно "запихнул".
  • Slym © (10.12.07 10:19) [22]
    Богдан   (10.12.07 9:59) [20]
    назначаются процедуры...

    А дальше долженбыть цикл выборки сообщений
 
Конференция "Сети" » проблема с DirectX (TDXPlay) [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]