![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Plug-in
андр © (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)