Форум: "Основная";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
Вниз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 надо выгрузить…
> ?
А вот что за два ноля знаешь?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]> Ну и…
Ну что они значат?
← →
Юрий Зотов © (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]> Но как использовать это не пойму…
Как использовать массив объектов?
← →
андр (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]> Ответа не нашел
« the return value is a handle to the module»
Не нашел такую строку? Ессно это и есть тот самый хендл.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c