Форум: "Основная";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
ВнизПеременные пакетов времени выполнения Найти похожие ветки
← →
Sirus (2008-02-18 12:50) [0]Привет Мастера!
Встала проблемка: Есть главное приложение и пакет времени выполнения (BPL). В БПЛке есть переменная, нужно из главного приложения поменять ее значение. Можно и наоборот, БПЛка берет значение из переменной в главном приложении.
Вопрос: Как реализовать?
← →
Сергей М. © (2008-02-18 13:21) [1]Самый просто способ - экспортировать идентификатор переменной (см. exports)
← →
Sirus (2008-02-18 14:04) [2]Можно примерчик, а то инфы на эту тему ни вь хелпе ни в инете не нашел :(
← →
Сергей М. © (2008-02-18 14:34) [3]program MyBPL;
...
var
MyExportedVariable: Integer;
..
exports MyExportedVariable;
...
var
pMyExportedVariable: PInteger;
hMyBPL := LoadLibrary("MyBPL.bpl");
pMyExportedVariable := GetProcAddress(hMyBPL, "MyExportedVariable");
pMyExportedVariable^ := 1234;
← →
Sirus (2008-02-19 05:40) [4]Это мне расписал экспорт из DLL библиотеки. :)
Дело в том что в package некуда впихнуть Exports :(
Вот код:package r3DWorkers;
{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$IMPLICITBUILD ON}
requires
rtl,
vcl,
dbrtl,
vcldb,
te_d6,
te_db_d6,
ibxpress;
contains
uDWorkersWF in "uDWorkersWF.pas" {DWorkersWF};
end.
В главном приложенииvar
HM_R3DWorkers: HModule;
DWorkersWFrm: TForm;
FrmClass: TFormClass;
procedure TMainForm.MPMDWorkersClick(Sender: TObject);
begin
HM_R3DWorkers:=LoadPackage("libs\r3dworkers.bpl");
if HM_R3DWorkers>0 then begin
FrmClass:=TFormClass(GetClass("TDWorkersWF"));
if Assigned(FrmClass) then begin
DWorkersWFrm:=FrmClass.Create(self);
DWorkersWFrm.Show;
end;
end;
end;
← →
Sirus (2008-02-19 07:58) [5]Вобщем опять сделал выводы :)
Использовать лучше DLL чем BPL, но при этом и в DLL и в главном приложении использовать build with run-time packages
← →
Сергей М. © (2008-02-19 09:06) [6]
> в package некуда впихнуть Exports
А справка говорит иначе:
An exports clause can appear anywhere and any number of times in the declaration part of a program or library, or in the interface or implementation section of a unit.
← →
Семеныч (2008-02-19 09:45) [7]> Sirus (18.02.08 12:50)
> В БПЛке есть переменная, нужно из главного приложения поменять ее
> значение.
unit OneOfBplUnits;
interface
var
MyMagicVar: MyMagicType;
...
end.
=======================
unit OneOfExeUnits;
uses
OneOfBplUnits;
...
implementation
procedure MyMagicClass.MyMagicProc;
begin
MyMagicVar := MyMagicValue; // MyMagic code!!!
end;
← →
Сергей М. © (2008-02-19 09:57) [8]
> Семеныч (19.02.08 09:45) [7]
Работать это не будет.
← →
Sirus (2008-02-19 09:59) [9]> Сергей М. © (19.02.08 09:06) [6]
Речь идет не о Library, а о Package (при компиляции создается файл *.bpl а не *.dll)
> Семеныч (19.02.08 09:45) [7]
То есть если есть один общий модуль Unit1.pas, то изменение значения переменной в этом модуле из главного приложения приведет к изменению значения этой переменной в BPL?
← →
Игорь Шевченко © (2008-02-19 10:01) [10]Сергей М. © (19.02.08 09:57) [8]
А куда оно денется - при статической линковке будет работать на ура.
← →
Sirus (2008-02-19 10:05) [11]
> Сергей М. © (19.02.08 09:57) [8]
>
> > Семеныч (19.02.08 09:45) [7]
>
>
> Работать это не будет.
Действительно не работает :(
← →
Сергей М. © (2008-02-19 10:19) [12]
> Sirus (19.02.08 09:59) [9]
Пакет - это, по сути, та же библиотека, только вид сбоку)
Пакет (bpl) и библиотека (dll) есть, прежде всего, PE-модуль, который подразумевает таблицу экспорта.
Читай внимательно -
exports clause can appear anywhere and any number of times in the declaration part of a program or library, or in the interface or implementation section of a unit
← →
Семеныч (2008-02-19 11:13) [13]> Сергей М. © (19.02.08 09:57) [8]
А куда оно денется - при статической линковке будет работать на ура.
(c) Игорь Шевченко
> Sirus (19.02.08 09:59) [9]
> если есть один общий модуль Unit1.pas, то изменение значения
> переменной в этом модуле из главного приложения приведет к
> изменению значения этой переменной в BPL?
При статической линковке по барабану, где эта переменная расположена. Лишь бы она была доступна.
> Sirus (19.02.08 10:05) [11]
Значит, Вы используете динамическую линковку. Но нигде об этом не сказали - а как раз об этом и надо было сказать в первую очередь.
← →
Sirus (2008-02-19 11:21) [14]
> Sirus (19.02.08 05:40) [4]
> ...
> В главном приложении
> var
> HM_R3DWorkers: HModule;
> DWorkersWFrm: TForm;
> FrmClass: TFormClass;
>
> procedure TMainForm.MPMDWorkersClick(Sender: TObject);
> begin
> HM_R3DWorkers:=LoadPackage("libs\r3dworkers.bpl");
> if HM_R3DWorkers>0 then begin
> FrmClass:=TFormClass(GetClass("TDWorkersWF"));
> if Assigned(FrmClass) then begin
> DWorkersWFrm:=FrmClass.Create(self);
> DWorkersWFrm.Show;
> end;
> end;
> end;
Здесь указал... т.е. не сказал что динамически, но из кода видно и так.
Теперь когда выяснили что имеем дело с динамической подгрузкой BPL, какие будут советы?
← →
Sirus (2008-02-19 12:13) [15]Проблемку решил немножко другим путем, создал наследник от TForm в котором создал необходимые мне свойства.
Теперь возникает другой вопрос: Как правильно выгрузить пакет BPL с немодальной формой внутри?
← →
Игорь Шевченко © (2008-02-19 12:36) [16]
> Здесь указал... т.е. не сказал что динамически, но из кода
> видно и так.
Дорогой друг, у нас проблемы с переменными, пакетами и прочей фигней нету и нам ее решать не надо. Проблема есть у тебя и в твоих интересах не притворятся партизаном, попавшим в плен к злым гестаповцам и ни за что не желающим открыть врагу военную тайну.
> Теперь возникает другой вопрос: Как правильно выгрузить
> пакет BPL с немодальной формой внутри?
Да пофиг как выгружать. Если у тебя при выгрузке какие-то проблемы, то нехреново бы их здесь озвучить, если проблем нету, то очевидно и спрашивать незачем, выгружай, как хочется и не мучайся.
← →
Sirus (2008-02-19 12:47) [17]Приношу свои извинения за "видно итак" :)
Загружаю пакетprocedure TMainForm.MPMDWorkersClick(Sender: TObject);
begin
HM_R3DWorkers:=LoadPackage("libs\r3dworkers.bpl");
if HM_R3DWorkers>0 then begin
SFClass:=TSrsFormClass(GetClass("TDWorkersWF"));
if Assigned(SFClass) then begin
DWorkersWFrm:=SFClass.Create(self);
DWorkersWFrm.MainDir:=MainDir;
DWorkersWFrm.MainFormHandle:=MainForm.Handle;
DWorkersWFrm.Show;
end;
end;
end;
Форма из пакета грузится, все тип-топ... При закрытии формы в OnClosePostMessage(MainFormHandle, WM_USER+301, 0, 0);
В главном приложении обрабатываю сообщениеProcedure TMainForm.WMFCDWorkers(var Msg: TMessage);
Begin
UnloadPackage(HM_R3DWorkers);
End;
При обработке сообщения возникает Access violation...
Паралелльно есть ееще вопрос: Нужно чтобы при клике в меню форма создавалась только если ее нет, а если есть то просто отображалась (выходила на передний план).
← →
Sirus (2008-02-19 13:06) [18]Если сделать так
Procedure TMainForm.WMFCDWorkers(var Msg: TMessage);
Begin
UnloadPackage(HM_R3DWorkers);
End
То ошибка пропадает, но возникает вопрос: Правильно ли это?
← →
Sirus (2008-02-19 13:07) [19]Если сделать так
Procedure TMainForm.WMFCDWorkers(var Msg: TMessage);
Begin
DWorkersWFrm.Free;
UnloadPackage(HM_R3DWorkers);
End
То ошибка пропадает, но возникает вопрос: Правильно ли это?
← →
Sirus (2008-02-19 13:11) [20]По моему все :)
Тему можно считать закрытой
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c