Главная страница
    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.046 c
2-1180337866
Rimd
2007-05-28 11:37
2007.06.17
События


2-1179926857
Oleg_teacher
2007-05-23 17:27
2007.06.17
DBLookupComboBox


15-1179999523
Vlad Oshin
2007-05-24 13:38
2007.06.17
Подскажите с блокировками. MSSQL-ADO


15-1179715477
Slider007
2007-05-21 06:44
2007.06.17
С днем рождения ! 20 мая


2-1179956014
snowkam2
2007-05-24 01:33
2007.06.17
многочлены помогите





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