Главная страница
    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.48 MB
Время: 0.004 c
1-1125995662
SuSanin
2005-09-06 12:34
2005.10.02
Разбиение отсканир. на разворот книги на страницы


1-1126074951
V-A-V
2005-09-07 10:35
2005.10.02
Как отловить запуск и завершение.


1-1126000453
Dennis S
2005-09-06 13:54
2005.10.02
Как читать из любого ЕХЕ файла данные...


3-1124193619
InVariantian
2005-08-16 16:00
2005.10.02
Как определить стоит ли на компе сервер Interbase?


1-1126250851
alsov
2005-09-09 11:27
2005.10.02
Устройство работающее через COM порт





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