Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.11.2009, 14:48
s0manmbula s0manmbula вне форума
Прохожий
 
Регистрация: 06.11.2009
Сообщения: 16
Репутация: 10
По умолчанию Помещение формы в DLL

Доброе время суток!!!

Есть задача: поместить форму (диалог) в dll файл. При закрытии этой формы (не сразу, иногда через какое-то время) происходит ошибка доступа в память:


Мой dll файл выглядит следующим образом:

Код:
var
  DllApp : TApplication;


function ShowAboutForm(MainApp : TApplication; xPos,yPos:Integer; vrs:PChar):Boolean; stdcall;
begin
  try
    if not Assigned(DllApp) then
      begin
        DllApp := Application;
        Application := MainApp;
      end;

    AboutDlgForm:=TAboutDlgForm.Create(Application.MainForm);

    //Выполняются всякие операции с формой и компонентами на ней
    AboutDlgForm.Left:=xPos;
    AboutDlgForm.Top:=yPos;
    AboutDlgForm.Label4.Caption:=vrs;

    //показ модальной формы
    AboutDlgForm.ShowModal;
    if AboutDlgForm.ModalResult= 1 then
      Result:=True
  finally
    if Assigned(DllApp) then
    Application := DllApp; 
    AboutDlgForm.Free;                 //Вот тут скорее всего ошибка?!
  end;
end;

exports
  ShowAboutForm;

И соответственно в моей программе организована динамическая загрузка dll:

Код:
TShowAboutForm = function(MainApp:TApplication; xPos,yPos:Integer; vrs:PChar):Boolean; stdcall;


procedure TForm1.N27Click(Sender: TObject);
var
  H:Cardinal;
  ShowAboutForm:TShowAboutForm;
  xPos,yPos:Integer;
begin
   //Определение положение AboutForm
  xPos:= Form1.Left+((Form1.Width - 449) Div 2);
  yPos:= Form1.Top+((Form1.height - 484) Div 2);
  
  {Загрузка библиотеки}
  H:=LoadLibrary('nms_rss.dll');

  {Получение адреса функции вывода формы}
  @ShowAboutForm:=GetProcAddress(H,'ShowAboutForm');

  {Вызов функции и получение ее результата}
  ShowAboutForm(Application, xPos,yPos,PChar('Какой-то текст'));

  {Выгрузим библиотеку}
  FreeLibrary(H);

end;

ПОМОГИТЕ ИЗБАВИТЬCЯ ОТ ЭТОЙ ОШИБКИ!!!!

Последний раз редактировалось s0manmbula, 06.11.2009 в 14:57.
Ответить с цитированием
  #2  
Старый 06.11.2009, 16:35
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Решения с ходу не дам, но посоветую передавать в dll Application от главного приложения при инициализации dll, потом в ней создавать форму(-ы)
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #3  
Старый 06.11.2009, 17:49
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

можно это проще сделать:
DLL:
Код:
function ShowAboutForm(xPos,yPos:Integer; vrs:PChar):Boolean; stdcall;
begin
with TAboutDlgForm.CreateParented(0) do
  begin
  //Выполняются всякие операции с формой и компонентами на ней
  Left:=xPos;
  Top:=yPos;
  Label4.Caption:=vrs;

  //показ модальной формы
  ShowModal;
  Free;
end;
end;

Exports
  ShowAboutForm;

Программа:
Код:
procedure TForm1.N27Click(Sender: TObject);
var
  H:Cardinal;
  ShowAboutForm:TShowAboutForm;
  xPos,yPos:Integer;
begin
   //Определение положение AboutForm
  xPos:= Form1.Left+((Form1.Width - 449) Div 2);
  yPos:= Form1.Top+((Form1.height - 484) Div 2);
  try
  {Загрузка библиотеки}
  H:=LoadLibrary('nms_rss.dll');

  {Получение адреса функции вывода формы}
  @ShowAboutForm:=GetProcAddress(H,'ShowAboutForm');

  {Вызов функции и получение ее результата}
  ShowAboutForm(xPos,yPos,PChar('Какой-то текст'));
  Finally
  {Выгрузим библиотеку}
  FreeLibrary(H);
  end;
end;

Поправил код
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз

Последний раз редактировалось Yurk@, 06.11.2009 в 18:51.
Ответить с цитированием
  #4  
Старый 06.11.2009, 18:10
s0manmbula s0manmbula вне форума
Прохожий
 
Регистрация: 06.11.2009
Сообщения: 16
Репутация: 10
По умолчанию

2 Yurk@:

В функции TAboutDlgForm.CreateParented не совпадают типы TApplication и THWND... Даже если вместо TApplication посылать в функцию дескриптор окна, то проблема осталась... ошибка всеравно вылетает...

2 AleD:
Цитата:
но посоветую передавать в dll Application от главного приложения при инициализации dll, потом в ней создавать форму(-ы)
Это как???
Ответить с цитированием
  #5  
Старый 06.11.2009, 18:15
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от s0manmbula
Это как???
ну как описал Yurk@, он в функции передаёт TApplication, и в нём создаёт форму из dll, то о чём я и говорил.
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #6  
Старый 06.11.2009, 18:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не надо в DLL создавать Application.
И присваивать его не надо.

Я, как понял, у тебя простая формочка. Создавай ее с родителем Nil, а упоминания Application вообще убери.

Если очень хочется пообщаться с Application, то делается это подругому.
Код:
{ DLL }
function ShowAboutForm(AHandle : THandle;...) : Boolean;
begin
  Application.Handle := AHandle;
  ...
end;

{ Program }
...
ShowAboutform(Application.Handle,...);
Ответить с цитированием
  #7  
Старый 06.11.2009, 18:54
s0manmbula s0manmbula вне форума
Прохожий
 
Регистрация: 06.11.2009
Сообщения: 16
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Не надо в DLL создавать Application.
И присваивать его не надо.

Я, как понял, у тебя простая формочка. Создавай ее с родителем Nil, а упоминания Application вообще убери.

Мне нужно создать модальную форму. а если ее создавать с родителем nil, то при ее создании создается значек на панели задач, вообщем ведет она себя не как диалог!!!


Цитата:
Сообщение от lmikle
Если очень хочется пообщаться с Application, то делается это подругому.

Код:
{ DLL }
function ShowAboutForm(AHandle : THandle;...) : Boolean;
begin
  Application.Handle := AHandle;
  ...
end;

{ Program }
...
ShowAboutform(Application.Handle,...);

Теперь ошибка access violation выскакивает при показе формы...


вот мой код программы:

Код:
procedure TForm1.N27Click(Sender: TObject);
type
  TShowAboutForm = function(AHandle : THandle; xPos,yPos:Integer; vrs:PChar):Boolean; stdcall;
var
  H:Cardinal;

begin
try
  H:=LoadLibrary('nms_rss.dll');
  @ShowAboutForm:=GetProcAddress(H,'ShowAboutForm');
  ShowAboutForm(Application.Handle, xPos,yPos,PChar(Value));
Finally
  FreeLibrary(H);
end;
end;


Код DLL:

Код:
function ShowAboutForm(AHandle : THandle; xPos,yPos:Integer; vrs:PChar):Boolean; stdcall;
begin
  try
    Application.Handle := AHandle;
    TAboutDlgForm.Create(Application);
    AboutDlgForm.ShowModal;
    if AboutDlgForm.ModalResult= 1 then
      Result:=True
  finally
    AboutDlgForm.Free;
  end;
end;

exports
  ShowAboutForm;

Я без понятия, где тут может быть ошибка...
Ответить с цитированием
  #8  
Старый 06.11.2009, 19:00
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

в dll то создал Application?
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #9  
Старый 06.11.2009, 19:16
s0manmbula s0manmbula вне форума
Прохожий
 
Регистрация: 06.11.2009
Сообщения: 16
Репутация: 10
По умолчанию

Цитата:
Сообщение от AleD
в dll то создал Application?

а как его там создать?

Разве этого не достаточно?
Код:
TAboutDlgForm.Create(Application);
Ответить с цитированием
  #10  
Старый 06.11.2009, 19:22
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от s0manmbula
а как его там создать?

Разве этого не достаточно?
Код:
TAboutDlgForm.Create(Application);
эм, извеняюсь, Application же в Forms сам создаётся...
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter