Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 надо выгрузить&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
2-1217326960
Mops
2008-07-29 14:22
2008.09.07
imagelist и image


15-1216176501
Slider007
2008-07-16 06:48
2008.09.07
С днем рождения ! 16 июля 2008 среда


2-1216792046
TStas
2008-07-23 09:47
2008.09.07
Есть ли какой-то особенный класс исключений при записи в ReadOnly


1-1198089818
lookin
2007-12-19 21:43
2008.09.07
Создание-удаление диалога


2-1216916846
koss
2008-07-24 20:27
2008.09.07
Отчет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский