Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.041 c
4-1168175568
Чапаев
2007-01-07 16:12
2007.06.17
Права доступа


2-1180411857
ААНе
2007-05-29 08:10
2007.06.17
Не могу понять!


1-1177014817
КрЫска
2007-04-20 00:33
2007.06.17
Какой пользователь работает на компьютере?


15-1179845192
Strate
2007-05-22 18:46
2007.06.17
Перевод из Fortran в Pascal (Delphi)


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский