Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2022, 11:14   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
Вопрос Поиск и выгрузка bpl

Добрый день!

Давно не спрашивал тут ничего, некогда вообще было, но сейчас столкнулся с вопросом одним.
Есть некий BPL пакет, назовем его Test.bpl, который успешно загружается в проект через LoadPackage().
После загрузки Test.bpl выполняются следующие действия:
1. Создается динамически TabSheet1;
2. Создается динамически Frame1 на созданной TabSheet1.
И вот, мне надо выгрузить Test.bpl допустим, в событии TabSheet1.OnClose().
Вот тут загвоздка и возникает.
Зная точно имя пакета моего, т.е. Test.bpl, как мне найти его и передать в UnloadPackage()?
Пакетов у меня может быть много загружено в память, как называется каждый я знаю, могу даже передавать в TabSheet1, в переменную p: HModule непосредственно имя загруженного пакета.

Прошу помочь с корректным поиском пакета и его выгрузкой в событии.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 25.11.2022, 12:58   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
как мне найти его
его не надо искать, его надо ЗАПОМНИТЬ при загрузке
Код:
var
  testbpl: HModule;

testbpl:=LoadPackage('test.bpl');

UnloadPackage(testbpl);
где запомнить?
1. глобальная переменная
2. private поле формы
3. ...
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.11.2022, 14:03   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
его не надо искать, его надо ЗАПОМНИТЬ при загрузке
Код:
var
  testbpl: HModule;

testbpl:=LoadPackage('test.bpl');

UnloadPackage(testbpl);
где запомнить?
1. глобальная переменная
2. private поле формы
3. ...
Ну, вот я так думал делать тоже, да.
Тогда получается какой алгоритм?
1. Запоминаю переменную эту;
2. При создании фрейма передаю туда ее;
3. При уничтожении фрейма, в OnDestroy, передаю обратно в главную программу эту переменную;
4. Выгружаю полученную переменную из фрейма в главном приложении в событии TabSheet1.OnClose?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 25.11.2022, 15:10   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Что ж, попробую пояснить, что на данный момент я сделал.
Итак, в главном приложении прописал:
Код:
...
private
    procedure SetGlobalValue_UnloadingBPL(const Value: HModule);
public
    test1, test2: HModule; //test1 - что передаю, test2 - для обратного получения в главное приложение
    property GV_UnloadingBPL: HModule read UnloadingBPL write SetGlobalValue_UnloadingBPL;
...
Код кнопки по передаче переменной во фрейм:
Код:
...
    if IsPublishedProp(Frame1,'GV_UnloadingBPL') then
       SetPropValue(Frame1,'GV_UnloadingBPL',test1);
...
Теперь в самом фрейме получаю мою переменную:
Код:
...
private
    procedure SetGlobalValue_GettingBPL(const Value: HModule);
public
    FG_GettingValue: HModule; //куда запоминаю переменную
    property GV_UnloadingBPL: HModule read FG_GettingValue write SetGlobalValue_GettingBPL;
...
Код получения переменной во фрейме:
Код:
procedure TFrameG1.SetGlobalValue_GettingBPL(const Value: NativeUInt);
begin
  FG_GettingValue:=Value;
end;
А вот код, когда закрывается фрейм (он закрывается по таймеру):
Код:
procedure TFrameG1.Timer_CloseTimer(Sender: TObject);
begin
      if IsPublishedProp(Self,'test2') then
         SetPropValue(Self,'test2',FG_GettingValue);
end;
Затем, пробую в главной программе выгрузить BPL при закрытии TabSheet1:
Код:
procedure TMainForm.TabSheet1_Close(Sender: TObject; var AllowClose: Boolean);
begin
  SetGlobalValue_UnloadingBPL(test2);

  if test2<> 0 then
  begin
    ShowMessage('Пакет загружен');
    UnloadPackage(test2);
  end;
end;
И вот, при выполнении всего этого, в главной программе получаю ошибку: Invalid package handle
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 25.11.2022, 15:59   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

у вас должно быть
Код:
TMainform =class()
private
  FtestBpl: HModule; // ОДНО поле и для загрузки и для выгрузки
Код:
procedure TMainform.AfterConstruction // или там где сочтете нужным
begin
...
 // if FtestBPL =0 then 
 FtestBPL:=LoadPackage('test.bpl');
...
end;
Код:
procedure TMainform.BeforeDestruction //или Опять же там где сочтете нужным
begin
...
  UnloadPackage(FtestBPL);
  FteslBpl:=nil;{0;} //можно на случай повторной загрузки
...
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.11.2022 в 16:02.
evg_m вне форума Ответить с цитированием
Старый 25.11.2022, 16:02   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

К настоящему моменту выяснил, что у меня почему-то в мой фрейм передается полный путь + название моего BPL загруженного.
Эта же информация передается из него в основную программу, но в основной программе у меня, почему-то (проверил через обычное сообщение, используя GetModuleName()), передается полный путь до ЕХЕ моего основного приложения.

Почему такое может быть, при GetModuleName()?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 25.11.2022 в 20:09.
artemavd вне форума Ответить с цитированием
Старый 26.11.2022, 14:33   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
у вас должно быть
Код:
TMainform =class()
private
  FtestBpl: HModule; // ОДНО поле и для загрузки и для выгрузки
Код:
procedure TMainform.AfterConstruction // или там где сочтете нужным
begin
...
 // if FtestBPL =0 then 
 FtestBPL:=LoadPackage('test.bpl');
...
end;
Код:
procedure TMainform.BeforeDestruction //или Опять же там где сочтете нужным
begin
...
  UnloadPackage(FtestBPL);
  FteslBpl:=nil;{0;} //можно на случай повторной загрузки
...
end;
Я попробовал применить аналогичный код TMainform.BeforeDestruction, но, не понимаю, куда его лучше разместить.
В событие OnClose закрываемой вкладки? Тогда вылетает AV.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 28.11.2022, 09:06   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Тогда вылетает AV.
и где оно вылетает?
какой КОД?!
какие переменные(объекты) там использованы?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выгрузка из TXT в Excel Aksuz Microsoft Office Excel 8 07.09.2016 08:22
Поиск содержания ячеек, удовлетворяющих диапазону и выгрузка строк или удаление лишних. tibhar940 Microsoft Office Excel 26 07.08.2012 12:33
Поиск и выгрузка данных из массива staniiislav Microsoft Office Excel 3 06.04.2012 08:42
Выгрузка в Xml AndreyF Общие вопросы Delphi 5 30.07.2010 14:53
выгрузка длл user_jasser Win Api 6 10.03.2009 14:09