![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про dll. [D7, XP]
GeLLeR © (2007-05-26 14:22:00)Добрый день всем!
У меня тут вопрос про 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-ке (извинете, если что-то не так сформулировал, но я думаю понятно). Помогите, пожалуйста. Заранее спасибо.
DrPass (2007-05-26 16:00:00) [1]
> MainForm.Free;
>
> h1 := MainForm.Handle;
А это что за лажа?
GeLLeR (2007-05-26 15:53:00) [2]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;
iXT (2007-05-26 15:36:00) [3]> procedure StopPlugin;
> begin
> CloseWindow(h2); // пытался и CloseHandle
> CloseWindow(h1);
> end;
Откуда процедура узнает h2 и h1?
и
> h1 := MainForm.Handle;
> h2 := ConnectionForm.Handle;
Это где-то описанно?
GeLLeR (2007-05-26 15:36:00) [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:19:00) [5]exports
GetPluginName, StartPlugin, StopPlugin; ???
а из var убрать export??? попытался... не получается....
попробую переформулировать. в длл-ке есть 2 формы. Подскажите как будет выглядеть прочедура, закрывающая обе эти формы.
Loginov Dmitry (2007-05-26 14:36:00) [6]Добавь в DPR-файл библиотеки секцию EXPORTS. В 32-разрядный версиях Delphi директива export нафик не нужна, она использовалась для 16-разрядных версий.