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

Вниз

Вопрос про dll.   Найти похожие ветки 

 
GeLLeR ©   (2007-05-26 14:22) [0]

Добрый день всем!
У меня тут вопрос про dll.

Пишу прогу с плагинами. Плагин представляет собой файл dll с экспортируемой функцией  GetPluginName, которая возвращает имя плагина в формате PChar и процедурами StartPlugin и StopPlugin, которые запускает и останавливают работу плагина соответственно. Вот часть
юнита плагина:

var
 MainForm: TMainForm;
 ...
 procedure StartPlugin(Handle: THandle); export; stdcall;
 procedure StopPlugin; export; stdcall;

implementation

uses ConnectionUnit;

procedure StartPlugin(Handle: THandle);
begin
 Application.Handle := Handle;
 MainForm:= TMainForm.Create(Application);
 ConnectionForm := TConnectionForm.Create(Application);
 MainForm.ShowModal;
 MainForm.Free;

 h1 := MainForm.Handle;
 h2 := ConnectionForm.Handle;
end;

procedure StopPlugin;
begin
 CloseWindow(h2); // пытался и CloseHandle
 CloseWindow(h1);
end;


StartPlugin работает нормально. Пытаюсь вызвать StopPlugin и получаю ошибку: Exception EReadError in module ... at 0001C697
Был и другой вариант: прога закрывалась а оставалось окно из dll-ки.

Вобщем-то вопрос: как вызвать закрытие всех окон в dll-ке (извинете, если что-то не так сформулировал, но я думаю понятно). Помогите, пожалуйста. Заранее спасибо.


 
Loginov Dmitry ©   (2007-05-26 14:36) [1]

Добавь в DPR-файл библиотеки секцию EXPORTS. В 32-разрядный версиях Delphi директива export нафик не нужна, она использовалась для 16-разрядных версий.


 
GeLLeR ©   (2007-05-26 15:19) [2]

exports
 GetPluginName, StartPlugin, StopPlugin; ???

а из var убрать export??? попытался... не получается....

попробую переформулировать. в длл-ке есть 2 формы. Подскажите как будет выглядеть прочедура, закрывающая обе эти формы.


 
iXT ©   (2007-05-26 15:36) [3]

> procedure StopPlugin;
> begin
> CloseWindow(h2); // пытался и CloseHandle
> CloseWindow(h1);
> end;


Откуда процедура узнает h2 и h1?
и

> h1 := MainForm.Handle;
> h2 := ConnectionForm.Handle;

Это где-то описанно?


 
GeLLeR ©   (2007-05-26 15:36) [4]

Вот кстати ещё процедура закрытия проги:

var
 StopPlugin: procedure; stdcall;
 DLLHandle: THandle;
 i: Integer;
begin
 for i := 0 to ListBoxFoundPlugins.Count - 1 do //там пути к плагинам
 begin
   DLLHandle := LoadLibrary(PChar(ListBoxFoundPlugins.Items.Strings[i]));
   @StopPlugin := GetProcAddress(DLLHandle, "StopPlugin");
   StopPlugin;
 end;
 CoolTrayIcon.IconVisible := False;
 Close;
end;  


Ещё обновление:

library vad_chat;

uses
 ConnectionUnit in "ConnectionUnit.pas" {ConnectionForm},
 MainUnit in "MainUnit.pas" {MainForm};

{$R *.res}

function GetPluginName: PChar;
begin
 Result := "×àò";
end;

exports
 GetPluginName, StartPlugin, StopPlugin;
end.


Дальше MainUnit:

var
 MainForm: TMainForm;
 ...
 procedure StartPlugin(Handle: THandle); stdcall;
 procedure StopPlugin; stdcall;

implementation

uses ConnectionUnit;

procedure StartPlugin(Handle: THandle);
var
 hwin: HWND;
begin
 hwin := FindWindow("TMainForm","Чат");
 if hwin <> 0 then Exit;
 Application.Handle := Handle;
 MainForm:= TMainForm.Create(Application);
 ConnectionForm := TConnectionForm.Create(Application);
 MainForm.ShowModal;
 MainForm.Free;

 h1 := MainForm.Handle;
 h2 := ConnectionForm.Handle;
end;

procedure StopPlugin;
begin
 if (h1 = 0) and (h2 = 0) then Exit;
 CloseWindow(h2);
 CloseWindow(h1);
end;


 
GeLLeR ©   (2007-05-26 15:53) [5]

procedure StartPlugin(Handle: THandle);
var
 hwin: HWND;
begin
 hwin := FindWindow("TMainForm","Чат");
 //if hwin <> 0 then Application.Terminate;
 Application.Handle := Handle;
 MainForm:= TMainForm.Create(Application);
 ConnectionForm := TConnectionForm.Create(Application);
 showmessage(inttostr(ConnectionForm.Handle));//тут ошибка. получается
 MainForm.ShowModal; // этой форме хэндл не присваивается ?!?!?!?!?!?!?
 MainForm.Free;      
end;

Application.Handle норамально. Но как узнать хэндл форм то тупость происходит...

 h2 := ConnectionForm.Handle; // это я запихнул в OnCreate
 h := Application.Handle;


 
DrPass ©   (2007-05-26 16:00) [6]


>  MainForm.Free;
>
>  h1 := MainForm.Handle;

А это что за лажа?



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

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

Наверх




Память: 0.48 MB
Время: 0.013 c
2-1180001170
Углук
2007-05-24 14:06
2007.06.17
Ресурсы не грузятся


15-1179740462
Капибара из дома
2007-05-21 13:41
2007.06.17
OpenDialog


8-1159138130
Brandik
2006-09-25 02:48
2007.06.17
Как тупо, банально рисовать на форме


2-1179154246
Lordalex
2007-05-14 18:50
2007.06.17
помогите с ошибкой


2-1180280198
HighIon
2007-05-27 19:36
2007.06.17
Array Of array +Pointer = Ошибка при выходе