Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];

Вниз

Вызов немодальной формы из DLL.   Найти похожие ветки 

 
Maverick ©   (2005-09-08 17:53) [0]

Вызываю немодальную форму из DLL. Если dll загружается статически то все ок. а вот с динамической загрузкой возникли проблемы :( . При вызове формы из главного приложения выдается ошибка "Недопустимый дескриптор окна"

Привожу код :

library FormInDll;
uses
 SysUtils,
 Classes,
 Unit1 in "Unit1.pas" {fMain};

{$R *.res}
exports
 ShowModalForm, ShowForm, FreeForm;
begin
end.

Форма в DLL:
unit Unit1;
interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TfMain = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
 public
 end;

 procedure ShowForm(Appl, Form: THandle); stdcall;
 procedure FreeForm; stdcall;

var
 fMain: TfMain;
 CallForm: THandle; //Дескриптор вызывающей формы

implementation
{$R *.dfm}

procedure ShowForm(Appl, Form: THandle); stdcall;
begin
 Application.Handle:= Appl;
 fMain:= TfMain.Create(Application);
 CallForm:= Form;
 fMain.Show;
end;

procedure FreeForm; stdcall;
begin
 fMain.Free;
end;

procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if CallForm <> 0 then
   SendMessage(CallForm, wm_User, 0, 0)
end;
end.

Вызов формы из главного приложения осуществляется так:

procedure TForm1.Button4Click(Sender: TObject);
var
 ShowForm : TShowForm;
 hndDLLHandle: THandle;
begin
 try
   hndDLLHandle := loadLibrary ( "FormInDll.dll" );
   if hndDLLHandle <> 0 then
   begin
     @ShowForm := getProcAddress ( hndDLLHandle, "ShowForm" );
     if Addr(ShowForm) <> nil then
     begin
       ShowForm(Application.Handle, self.Handle);
     end
     else
       showMessage ( "Function not exists..." );
   end
   else
     showMessage ( "DLL not found..." );
 finally
   freeLibrary ( hndDLLHandle );
 end;
end;


 
Игорь Шевченко ©   (2005-09-08 17:59) [1]


> выдается ошибка "Недопустимый дескриптор окна"


В каком месте ?


 
Maverick ©   (2005-09-08 18:10) [2]

что то под вечер я уже туплю :)
ошибка выскакивает на строчке
ShowForm(Application.Handle, self.Handle);
главного приложения, запустив дебагер в dll - ShowForm даже не выполняется.


 
Игорь Шевченко ©   (2005-09-08 18:12) [3]


>  if Addr(ShowForm) <> nil then


if Assigned(ShowForm) then


 
Maverick ©   (2005-09-08 18:18) [4]

не помогло :(


 
Игорь Шевченко ©   (2005-09-08 18:20) [5]


>  procedure ShowForm(Appl, Form: THandle); stdcall;


А тип TShowForm в основном приложении как объявлен ?


 
Maverick ©   (2005-09-08 18:22) [6]

вот так :

type
 TShowForm = procedure (Appl, Form: THandle);


 
Maverick ©   (2005-09-08 18:25) [7]

но ведь если я dll-ку гружу статически то все ок, ни каких ошибок


 
jack128 ©   (2005-09-08 18:27) [8]

Maverick ©   (08.09.05 18:22) [6]
TShowForm = procedure (Appl, Form: THandle);

Maverick ©   (08.09.05 17:53)
procedure ShowForm(Appl, Form: THandle); stdcall;


ps не надо долго перед компьютером сидеть, а то уже совсем зрение посадил..


 
Игорь Шевченко ©   (2005-09-08 18:28) [9]

Maverick ©   (08.09.05 18:22) [6]

type
TShowForm = procedure (Appl, Form: THandle); stdcall;


 
isasa ©   (2005-09-08 18:30) [10]

Недавно был предмет спора, что есть Application в DLL?
...
Application.Handle:= Appl;
fMain:= TfMain.Create(Application);
.....


может так
...
fMain:= TfMain.Create(nil);
...

все равно руками закрываем форму.


 
Maverick ©   (2005-09-08 18:31) [11]

:))
да, спасибо большое:))
действительно вредно сидеть долго перед компом.


 
Игорь Шевченко ©   (2005-09-08 18:31) [12]


> Недавно был предмет спора, что есть Application в DLL?


Спорить не о чем.


 
Maverick ©   (2005-09-08 18:33) [13]

isasa ©   (08.09.05 18:30) [10]

согласен



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

Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
1-1126100942
Суслик
2005-09-07 17:49
2005.10.02
Проблемы с формой из runtime-пакета


1-1125897918
Fanny
2005-09-05 09:25
2005.10.02
Как "победить" лимит String в Записи ?


1-1126014484
NikNet
2005-09-06 17:48
2005.10.02
Что значит VMT?


1-1126068565
Reunion
2005-09-07 08:49
2005.10.02
Русския язык на формах в английской Windows


1-1126171989
Lamka
2005-09-08 13:33
2005.10.02
Как получить dcu?





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