Конференция "KOL" » Работа между Exe и Dll
 
  • Друг (26.08.14 12:30) [0]
    Поставлена достаточно странная задача, но она есть

    В Exe создаётся главное окно, выполняет какую-то работу, реагирует на действия пользователя... Потом в один прекрасный момент загружается Dll, в которую передаётся хендл окна и вся дальнейшая рутина по отрисовке окна и обработке сообщений - должна проходить уже внутри Dll.

    Причём Dll теоретически можно подсовывать разные. Каждая Dll отвечает за свой GUI и свои манипуляции с главным окном.

    Вопрос только один. Как это реализовать на KOL и не мучиться потом с подводными камнями?
    P.S. в KOL не профи
  • RusSun © (27.08.14 08:45) [1]
    Добрый день. Придется набраться терпения. Так как форум KOL
    стал мало посещаемым и новые темы появляются довольно редко.
    И по этой причине люди заходят реже, чем n-е время назад.

    1 Лучше просмотреть форум поиском http://www.delphimaster.net/
    введя нужные ключевые слова

    2.  Сомневаюсь, что сразу дадут рабочий вариант
    Дорогу осилит идущий ( Viam supervadet vadens )
    нужно упорно идти к цели, если оно Вам действительно надо тогда помогут 100%
  • Thaddy © (27.08.14 09:50) [2]
    If the dll is written in kol and you compile it yourself and the main program as well, there are two options:

    1. Add sharemem to the uses clause as the first unit in the library AND the program file.
    This requires that you also use sharemem.dll from borland.

    2. You can use my COM memory manager that doesn't need sharemem. You also have to add that as the first unit in the library code and the main program. It slows your program a bit (5%)
    You can get it here: http://thaddy.co.uk/commm.pas and doesn't need the sharemem.dll
  • Друг (27.08.14 18:14) [3]
    > RusSun ©   (27.08.14 08:45) [1]

    Поиск не работает

    > Thaddy ©   (27.08.14 09:50) [2]

    I need to perform an Applet/MainForm message loop synchronization
  • Rouse_ © (27.08.14 19:10) [4]
    Дим, посмотри что Саня Gunsmoker по этой теме писал: http://www.gunsmoker.ru/2013/04/plugins-9.html (начинай с первой части)
    По сути то что тебе нужно и без сильных завязок на VCL
  • Друг (27.08.14 20:02) [5]
    > Rouse_ ©   (27.08.14 19:10) [4]

    В целом статья годная, надо будет почитать
    А вообще по теме - с задачей похоже справился

    Один из главных пунктов решения ситуации - сделать так, чтобы в качестве аплета выступало главное окно (не делать два окна как это обычно бывает)

    Вот часть кода на стороне Dll, кому надо:
    // чтобы в режиме exe+dll не создавать ещё одно окно аплета
    // приходится прибегать к такому хаку - явно задавать хендл имеющегося окна
    {$IFDEF FULL_DLL}
    type
     THandledControl = object(TControl)
       property Handle: HWnd read fHandle write fHandle;
     end;
    {$ENDIF}

    // универсальный код запуска приложения (exe и dll).
    procedure RunApplication({$IFDEF FULL_DLL}const AppletHandle: HWND{$ENDIF});
    const
     strAppName='My Application';
    {$IFDEF FULL_DLL}
    var
     LastSelf: integer;
    {$ENDIF}
    begin
     // в качестве аплета выступает главное окно
     Applet := NewForm(nil, strAppName);
     {$IFDEF FULL_DLL}
       THandledControl(Applet^).Handle := AppletHandle;
       LastSelf := SetWindowLong(AppletHandle, GWL_USERDATA, Longint(Applet));
     {$ENDIF}

     // конструктор главной формы
     New(MainFrm, Create);
     MainFrm.Form := Applet;

     // свойства и события
     // todo

     // запуск
     Run(Applet);

     {$IFDEF FULL_DLL}
        SetWindowLong(AppletHandle, GWL_USERDATA, LastSelf);
     {$ENDIF}
    end;

    {$IFDEF FULL_DLL}
    procedure run(const AppletHandle: HWND);
    var
     LastWndFunc: integer;
    begin
     // необходимо подменить оконную функцию
     LastWndFunc := SetWindowLong(AppletHandle, GWL_WNDPROC, Longint(@KOL.WndFunc));
     try
       RunApplication(AppletHandle);
     finally
       // возвращаем оконную функцию
       SetWindowLong(AppletHandle, GWL_WNDPROC, LastWndFunc);
     end;
    end;

    exports run;
    {$ENDIF}

    begin
     {$IFNDEF FULL_DLL}
         RunApplication();
     {$ENDIF}
    end.

  • Rouse_ © (27.08.14 21:22) [6]
    Серьезно ж тебя поднапрягли :)
    Ну значит с правильными людьми я тебя связал... Удачи :)
  • Друг (27.08.14 21:53) [7]
    Все относительно :)
  • RusSun © (28.08.14 18:30) [8]
    Как искать?

      Ниже описаны возможности поиска:
    поиск осуществляется по словам, состоящим из более чем трех символов
    если Вы не знаете окончания слова, то нужно добавить символ *. Пример запроса: devex*
    для исключения какого-либо слова из результатов выборки следует перед ним поставить знак минус. Пример запроса: -delphi
    для обязательного включения какого-либо слова/слов в результат выборки следует перед ним поставить знак плюс, учтите, что при указании нескольких слов со знаком плюса, может значительно сократиться количество найденных веток в результате. Пример запроса: +delphi +jedi
    операторы <> используются для того, чтобы изменить вклад слова в величину релевантности, которое приписывается строке. Оператор < уменьшает этот вклад, а оператор > - увеличивает его. Пример запроса: <delphi
    предшествующий слову знак ~ ("тильда") воздействует как оператор отрицания, обуславливая негативный вклад данного слова в релевантность строки. Им отмечают нежелательные слова. Строка, содержащая такое слово, будет оценена ниже других, но не будет исключена совершенно, как в случае оператора - "минус".
    фраза, заключенная в двойные кавычки, соответствует только строкам, содержащим эту фразу, написанную буквально. Пример: "Problema s GetKeyboardState"
    слова можно группировать, используя скобки. Пример запроса: (+VirtualKeyCode +integer) (+Interbase +Console)
    даты вводятся в формате ГГГГ-ММ-ДД, причем вводить полностью не обязательно, достаточно ввести только год или год и месяц, найдутся все ветки с начальной даты до конечной.
    для поиска всех сообщений, в которых писал пользователь или писали о нем, достаточно задать имя этого пользователя в поисковой строке. Пример: +RIMMER. Также можно найти ветку, если знаете пользователей, писавших в этой ветке(ах): +KilkennyCat +Kerk +xayam

    http://delphimaster.net/?s=dll*&pcount=500&forum=11&user=&order=REPLYDATE&dir=desc&title=1&message=1&dat e_begin=&date_end=
  • Sheleh (07.01.15 14:04) [9]
    // конструктор главной формы
    New(MainFrm, Create);
    MainFrm.Form := Applet;


    MainFrm Что за объект? Как инициализировать?
  • Sheleh (07.01.15 14:13) [10]
    {$IFNDEF FULL_DLL}
        RunApplication(); //Not enough actual parameters
    {$ENDIF}

    Вообще откуда этот код? Это статья? Она не ищется в интернете
  • ParanoiS © (29.01.15 18:53) [11]
    2Друг: ты бы в примере uses kol написал, а то люди некоторые не понимают:)

    2Шелех: MainFrm Что за объект? Как инициализировать? => New(MainFrm, Create); // это object (KOL.PPObj)
 
Конференция "KOL" » Работа между Exe и Dll
Есть новые Нет новых   [118666   +36][b:0][p:0.002]