Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Plug-in


Страницы:   1 2

андр ©   (2007-12-20 13:42:00) 

Есть дерево меню, создоваемое динамически. У каждого этемента этого дерева есть поля FFileName имя dll которую необходимо загрузить, и FParam поле которое содержит параметры  передаваемые в плагин
TMyMenuItem=class(TMenuItem)
private
 FFileName: String;
 FParam: String;
public
 procedure Click; override;
end;
...

По клику плагин инициализирую и выполняю, а вот как правельно после окончания какихто работ в плагине выгрузить его FreeLibrary т.е. как мне узнать что именно выгружать нужно, какой именно Handle   ... ???


Kolan   (2007-12-24 11:24:00) [1]

> Ответа не нашел

« the return value is a handle to the module»

Не нашел такую строку? Ессно это и есть тот самый хендл.


андр   (2007-12-24 10:45:00) [2]


> Kolan ©   (20.12.07 14:56) [20]

Ответа не нашел, но вроде библиотеку выгружает!


Kolan   (2007-12-20 14:56:00) [3]

> Но будет ли Handle dll-ки, равен Handle := LoadLibrary(dll)
> ;

Ответ в справке по LoadLibrary.


Kolan   (2007-12-20 14:55:00) [4]

Ну тогда тебе надо:

1. Создать плагин и создать класс TModule. Запомнить хендл плагина в экземпляр TModule.
2. Поместить экземпляр TModule в массив, а индекс передеать в плагин. Плагин этот индекс должен запомнить.
3. Когда поагин отработал, то передавать в PoatMessage этот индекс и делать Free объекту( в его деструкторе есть FreeLibrary).

Таких вариантов миллион.


андр   (2007-12-20 14:55:00) [5]


> Юрий Зотов ©  

Спасибо тоже огромное!


андр   (2007-12-20 14:53:00) [6]

Но будет ли Handledll-ки, равен Handle := LoadLibrary(dll);
? Или я не правельно понял...


андр   (2007-12-20 14:50:00) [7]


> Kolan ©   (20.12.07 14:47) [15]


Не просто я думал модет, потом передовать Post om
Типа элемент массива а потом
детать типа Modules[i].Free

Но это

> Kolan ©   (20.12.07 14:42) [11]

еще раз преблизело тебя к Мастеру, ;-) , я блин недогадался....
В который раз спасибо этому форуму... !
:-)


Kolan   (2007-12-20 14:47:00) [8]

> Но как использовать это не пойму…

Как использовать массив объектов?


андр   (2007-12-20 14:47:00) [9]


> Kolan ©   (20.12.07 14:42) [11]


> Kolan ©   (20.12.07 14:43) [12]


А ведь верно говарит мальчишка ?!


андр   (2007-12-20 14:46:00) [10]

Есть такая статья, на мой взгляд интересная.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=512
Sources
http://www.delphikingdom.com/zip/pluginssrc.zip

Так вот там какой клас....

примерно опишу..


unit uModules;

interface

uses
 Windows;

type

 TInitialize = procedure(App: Integer); stdcall;
 TRun = procedure; stdcall;
 TTerminate = procedure; stdcall;

 TModule = class
 private
   FFileName: String;
   FHandle: THandle;
   FInitialize: TInitialize;
   FRun: TRun;
   FTerminate: TTerminate;
 public
   constructor Create(AFileName: String; AApp: Integer; var IsValidModule: Boolean);
   destructor Destroy; override;
   procedure Initialize(AApp: Integer);
   procedure Run;
   procedure Terminate;
   property FileName: String read FFileName;
   property Handle: THandle read FHandle;
 end;

implementation

constructor TModule.Create(AFileName: String; AApp: Integer; var IsValidModule: Boolean);
begin
 IsValidModule := False;
 FHandle := LoadLibrary(PChar(AFileName));
 if FHandle >= 32 then begin
   FInitialize := GetProcAddress(FHandle, 'Initialize');
   FRun := GetProcAddress(FHandle, 'Run');
   FTerminate := GetProcAddress(FHandle, 'Terminate');
   Initialize(AApp);
   IsValidModule := True;
 end;
end;

destructor TModule.Destroy;
begin
 FreeLibrary(FHandle);
 inherited Destroy;
end;

procedure TModule.Initialize(AApp: Integer);
begin
 if @FInitialize<>nil then
   FInitialize(AApp);
end;

procedure TModule.Run;
begin
 if @FRun<>nil then
   FRun;
end;

procedure TModule.Terminate;
begin
 if @FTerminate<>nil then
   FTerminate;
end;

end.



И вот что интересно: Modules: array of TModule;

Но как использовать это не пойму...


Kolan   (2007-12-20 14:43:00) [11]

> То есть передаешь хендл в парамере

А хендл получаешь так, как сказал Юрий Зотов.


Kolan   (2007-12-20 14:42:00) [12]

> Той, в которой сидит класс закрываемой формы. Ее хэндл и
> дает FindClassHInstance.


То есть передаешь хендл в парамере

PostMessage(Application.MainForm.Handle, WM_USER + 1, Handle, 0)

При получении сообщения в осн. программе делаешь что-то вроде:

FreeLibrary(Message.WParam);


Юрий Зотов   (2007-12-20 14:38:00) [13]

> андр   (20.12.07 14:32) [8]

> и я должен послать сообщение на выгрузку dll...
> НО КАКОЙ ИМЕННО ?

Той, в которой сидит класс закрываемой формы. Ее хэндл и дает FindClassHInstance.


Юрий Зотов   (2007-12-20 14:35:00) [14]

> андр   (20.12.07 14:14) [2]

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


андр   (2007-12-20 14:32:00) [15]


> FindClassHInstance

А астоит ли такую "машину" использовать в такой задаче?


> Kolan ©   (20.12.07 14:24) [7]

Как блин (не грублю) :-) ....

Весь день уже промучался.... Затеял все под плагины переписать, лутшеб не трогал проект.... 8-)

Допустип:


{ TMyMenuItem }

 TMyMenuItem = class(TMenuItem)
 private
   FFileName: String;
   FParam: String;
   FHandle: THandle;
 public
   procedure Click; override;
 end;



{ TMyMenuItem }

procedure TMyMenuItem.Click;
begin
 inherited Click;
 FHandle := LoadFromLibrary(FFileName);
 Init(Integer(Application));  //Передаем App...
 Run(FParam);  //Передаем параметры запуска...
end;


Все загружается и работает....

Допустим понаоткрывал я таких форм 10, из разных плагинов, закрываю один из них,  и я должен послать сообщение на выгрузку dll...

НО КАКОЙ ИМЕННО ?


Kolan   (2007-12-20 14:24:00) [16]

> FindClassHInstance

Да в параметре его передать.


Юрий Зотов   (2007-12-20 14:21:00) [17]

> андр   (20.12.07 14:14) [2]

FindClassHInstance


Kolan   (2007-12-20 14:20:00) [18]

> Ну и…

Ну что они значат?


андр   (2007-12-20 14:19:00) [19]


> Kolan ©   (20.12.07 14:18) [3]


Ну и...


Kolan   (2007-12-20 14:18:00) [20]

>
> А как блин, знать какой именно Handle надо выгрузить…
> ?

А  вот что за два ноля знаешь?

PostMessage(Application.MainForm.Handle, WM_USER + 1, 0, 0)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо