Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
ВнизВопрос про 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c