Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.07;
Скачать: CL | DM;

Вниз

Plug-in   Найти похожие ветки 

 
андр   (2007-12-20 13:42) [0]

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

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


 
Dib@zol ©   (2007-12-20 13:44) [1]

Кхм. Ну введи ещё поле, скажем, DLLHandle, и записывай в него хендл... А в чём проблема?


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

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

Ну допустим....

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

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

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


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

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

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

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


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


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


Ну и...


 
Kolan ©   (2007-12-20 14:20) [5]

> Ну и&#133

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


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

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

FindClassHInstance


 
Kolan ©   (2007-12-20 14:24) [7]

> FindClassHInstance

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


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


> 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...

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


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

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

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


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

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

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

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


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

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


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

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

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

FreeLibrary(Message.WParam);


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

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

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


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

Есть такая статья, на мой взгляд интересная.
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;

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


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


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


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


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


 
Kolan ©   (2007-12-20 14:47) [15]

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

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


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


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


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

Но это

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

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


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

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


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


> Юрий Зотов ©  

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


 
Kolan ©   (2007-12-20 14:55) [19]

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

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

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


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

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

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


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


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

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


 
Kolan ©   (2007-12-24 11:24) [22]

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

&laquo; the return value is a handle to the module&raquo;

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



Страницы: 1 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
3-1205422412
Цукор5
2008-03-13 18:33
2008.09.07
OLE и FireBird


3-1204889422
Prohodil Mimo
2008-03-07 14:30
2008.09.07
Возможно ли составить SQL запрос с NULL?


2-1217239029
Fynjy
2008-07-28 13:57
2008.09.07
создание компанента вручную


15-1216091674
КросавЧЕГ
2008-07-15 07:14
2008.09.07
Помогите оптимизировать


15-1216394724
Skiminok
2008-07-18 19:25
2008.09.07
Орешник