-
Кто-нибудь имеет опыт создания 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, по одному и тому же адресу).
-
Речь идет о IW Standalone-приложении ?
-
Да. Сорри, что не указал явно. Версия IW 12.1.25 Ultimate, XE.
-
как в хост-приложении объявлена и инициализирована WebApplication ? TIWForm1 - это главная форма ?
-
1. Это системная переменная IW (олицетворяет "приложение") - именно она используется при создании форм IW, передается как владелец (при создании форма регистрируется в специальных списках и т.п.). 2. Нет. Главная форма в приложении, в принципе - это абсолютно такая же форма, только для нее вызван метод SetAsMainForm (так, кажется).
-
А почему собственно не bpl ?
-
Пробовал и bpl. Эффект такой же. Меня пакет не устраивает по той причине, что вторую копию (более свежей) версии загрузить не получится. С dll такое возможно.
-
> пакет не устраивает по той причине, что ..загрузить не получится
Что за ерунда ? bpl - та же dll, но специально "заточенная" под специфику межмодульного взаимодействия в VCL-проектах
-
> только для нее вызван метод SetAsMainForm
Так тоже самое, вероятно, следует делать и для любой другой IWAppForm-формы, претендующей на замещение ранее установленной главной.. Причем до установки ее свойства Visible..
Кр.того, и хост-приложение и dll должны использовать один и тот же IW runtime-пакет, в противном случае экземпляры глоб.переменной WebApplication у них будут разные, со всеми вытекающими последствиями.
-
Ерунда-не ерунда, а копию bpl загрузить не получится - одинаковый набор модулей. Попробуй, если интересно. Мне же нужно загрузить модуль новой версии наряду с уже загруженным экземпляром старой версии. Зачем и почему - вопрос отдельный...
А кто сказал, что мне нужно заместить главную форму? "Экземпляры" Application, WebApplication и даже кое-что еще передавать в Dll для "подмены" в контексте модуля тоже пробовал - такой прием с vcl-формамим как раз работает. С интравебом - нет.
Компилил Dll и приложение с рунтайм пакетами. Не помогает... Только адрес узнал и модуль, где эцепшн - intraweb_150_120.bpl, адрес не помню...
-
Все идет к тому что глоб.объеты TWebApplication в вызываемом и вызывающем модулях разные. Причем в вызываемом он, видимо, nil - никто его не инициализировал.
-
Похоже. Не все они 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;
Не помню на каком этапе именно, но вылезла ошибка, связанная с невозможностью повторно открыть файловый ресурс. Вот тут-то у меня руки и опустились - вряд ли получится это дело решить, инфы - нет практически, исходники закрыты. А инфраструктура там по инициализации создается нехилая... На эмбаркадеровском форуме какой-то "буржуй", причем из завсегдатаев, как я понял, на этот же вопрос посоветовал коммерчесую систему организации плагинсов. Мда...
-
А много ли уже наворотил на этом Интравебе ? Может ну его к лешему и пока не поздно развернуть лыжи в сторону более привлекательных и живых RIA-проектов ?
-
Только начинаю. Сам-то он жив, развивается. Есть возможность в дальнейшем купить. Но напрягает, что документация отстает катастрофически.
-
Загляни в альтернативные проекты Raudus, ExtPascal, UniGui, qxpascal
-
Смотрел, UniGUI очень симпатичен. Однако он будет платным, да и судьба всех этих проектов в целом не ясна. Закладываться на них в коммерческой разработке проблематично. IntraWeb в этом плане более надежен, "обстрелян" и т.п.
-
Все же плотнее глянул uniGUI. Довольно мощная перспективная вещь. Хелпов, правда, никаких. И сырцов нет. Но примеров масса. Учитывая, что мне понадобятся самые простые контролы, попробую наверное на ней забацать. Тем более, что получилось загружать формы из DLL (+ runtime packages) ! Причем две одинаковые DLL разных версий, загруженные последовательно, рожают, как и положено, разные формы. Такие дела.
|