Конференция "Сети" » IntraWeb: динамическое создание IW-формы в вызове DLL
 
  • dred2k © (11.01.13 12:59) [0]
    Кто-нибудь имеет опыт создания IW-форм в вызове динамически загружаемой DLL ?
    Ниже приведен фрагмент моих увы безуспешных попыток.

    DLL:

    type
     TIWForm1 = class(TIWAppForm)
       IWLabel1: TIWLabel;
       IWButton1: TIWButton;
     public
     end;

     function CreateNewForm(const AWebApp : TIWApplication) : TIWAppForm;

    implementation

    function CreateNewForm(const AWebApp : TIWApplication) : TIWAppForm;
    begin
     Result := TIWForm1.Create(AWebApp);
    end;



    Главная IW-форма:

    type
     TCreateNewForm = function(const AWebApp : TIWApplication) : TIWAppForm;

    procedure TIWFormMain.BtnDLLForm1Click(Sender: TObject);
    var tmpDll : Cardinal;
       tmpP : TCreateNewForm;
       tmpF : TIWAppForm;
    begin
     tmpDll := LoadLibrary('dll\iwdll.dll');
     if(tmpDll <= HINSTANCE_ERROR) then
       raise Exception.Create('Ошибка загрузки модуля.');
     @tmpP := nil;
     @tmpP := GetProcAddress(tmpDll, 'CreateNewForm');
     if(not Assigned(@tmpP)) then
       raise Exception.Create('Ошибка получения адреса вызова.');
     tmpF := tmpP(WebApplication);
     tmpF.Show;
    end;



    ShareMem, компиляция с runtime-пакетами - было перепробовано многое.
    На вызове конструктора формы (в DLL) - access violation (в пакете intraweb_150_120, по одному и тому же адресу).
  • Сергей М. © (11.01.13 18:20) [1]
    Речь идет о IW Standalone-приложении ?
  • dred2k © (14.01.13 09:23) [2]
    Да. Сорри, что не указал явно.
    Версия IW 12.1.25 Ultimate, XE.
  • Сергей М. © (14.01.13 09:27) [3]
    как в хост-приложении объявлена и инициализирована WebApplication ?
    TIWForm1 - это главная форма ?
  • dred2k © (14.01.13 10:12) [4]
    1. Это системная переменная IW (олицетворяет "приложение") - именно она используется при создании форм IW, передается как владелец (при создании форма регистрируется в специальных списках и т.п.).
    2. Нет. Главная форма в приложении, в принципе - это абсолютно такая же форма, только для нее вызван метод SetAsMainForm (так, кажется).
  • Сергей М. © (14.01.13 10:38) [5]
    А почему собственно не bpl ?
  • dred2k © (14.01.13 10:51) [6]
    Пробовал и bpl. Эффект такой же.
    Меня пакет не устраивает по той причине, что вторую копию (более свежей) версии загрузить не получится. С dll такое возможно.
  • Сергей М. © (14.01.13 11:27) [7]

    > пакет не устраивает по той причине, что ..загрузить не получится


    Что за ерунда ?
    bpl - та же dll, но специально "заточенная" под специфику межмодульного взаимодействия в VCL-проектах
  • Сергей М. © (14.01.13 11:43) [8]

    > только для нее вызван метод SetAsMainForm


    Так тоже самое, вероятно, следует делать и для любой другой IWAppForm-формы, претендующей на замещение ранее установленной главной.. Причем до установки ее свойства Visible..

    Кр.того, и хост-приложение и dll должны использовать один и тот же IW runtime-пакет, в противном случае экземпляры глоб.переменной WebApplication у них будут разные, со всеми вытекающими последствиями.
  • dred2k © (14.01.13 12:42) [9]
    Ерунда-не ерунда, а копию bpl загрузить не получится - одинаковый набор модулей. Попробуй, если интересно. Мне же нужно загрузить модуль новой версии наряду с уже загруженным экземпляром старой версии. Зачем и почему - вопрос отдельный...

    А кто сказал, что мне нужно заместить главную форму?
    "Экземпляры" Application, WebApplication и даже кое-что еще передавать в Dll для "подмены" в контексте модуля тоже пробовал - такой прием с vcl-формамим как раз работает. С интравебом - нет.

    Компилил Dll и приложение с рунтайм пакетами. Не помогает... Только адрес узнал и модуль, где эцепшн - intraweb_150_120.bpl, адрес не помню...
  • Сергей М. © (14.01.13 13:15) [10]
    Все идет к тому что глоб.объеты TWebApplication в вызываемом и вызывающем модулях разные. Причем в вызываемом он, видимо, nil - никто его не инициализировал.
  • dred2k © (14.01.13 13:52) [11]
    Похоже. Не все они nil, как показывает проверка, но это не столь важно.
    Пробовал передавать и подменять все, которые обнаружил, а именно:

    [сторона DLL]

    function CreateNewFormEx(const AApp, AWebApp, ASessions, ASC, ASCC : Pointer) : TIWAppForm;
    begin
     Application := AApp;
     GSetWebApplicationThreadVar(AWebApp);
     GSessions := ASessions;
     gServerController := ASC;
     gServerControllerClass := ASCC;
     Result := TIWForm1.Create(AWebApp);
    end;



    Не помню на каком этапе именно, но вылезла ошибка, связанная с невозможностью повторно открыть файловый ресурс. Вот тут-то у меня руки и опустились - вряд ли получится это дело решить, инфы - нет практически, исходники закрыты. А инфраструктура там по инициализации создается нехилая... На эмбаркадеровском форуме какой-то "буржуй", причем из завсегдатаев, как я понял, на этот же вопрос посоветовал коммерчесую систему организации плагинсов. Мда...
  • Сергей М. © (14.01.13 14:05) [12]
    А много ли уже наворотил на этом Интравебе ?
    Может ну его к лешему и пока не поздно развернуть лыжи в сторону более привлекательных и живых RIA-проектов ?
  • dred2k © (14.01.13 14:11) [13]
    Только начинаю. Сам-то он жив, развивается. Есть возможность в дальнейшем купить. Но напрягает, что документация отстает катастрофически.
  • Сергей М. © (14.01.13 17:57) [14]
    Загляни в альтернативные проекты Raudus, ExtPascal, UniGui, qxpascal
  • dred2k © (15.01.13 09:18) [15]
    Смотрел, UniGUI очень симпатичен. Однако он будет платным, да и судьба всех этих проектов в целом не ясна. Закладываться на них в коммерческой разработке проблематично. IntraWeb в этом плане более надежен, "обстрелян" и т.п.
  • dred2k © (16.01.13 16:55) [16]
    Все же плотнее глянул uniGUI. Довольно мощная перспективная вещь. Хелпов, правда, никаких. И сырцов нет. Но примеров масса.
    Учитывая, что мне понадобятся самые простые контролы, попробую наверное на ней забацать.
    Тем более, что получилось загружать формы из DLL (+ runtime packages) !
    Причем две одинаковые DLL разных версий, загруженные последовательно, рожают, как и положено, разные формы.
    Такие дела.
 
Конференция "Сети" » IntraWeb: динамическое создание IW-формы в вызове DLL
Есть новые Нет новых   [118448   +36][b:0][p:0.002]