Перейти к содержанию
Fire Monkey от А до Я
  • 0

AccessViolation при закрытии FMX приложения, использующего FMX Dll с ShowMessage()


usmanovtt

Вопрос

Здравствуйте, коллеги. Использую RAD Studio 10.3 и FMX Linux 1.65.  Столкнулся с проблемой как говорится 'на ровном месте'. Приложение и Dll написаны с использованием FMX. Оставил только минимум (убрал не только функционал но и проверки). Нажатие на кнопку может происходить по несколько раз, проблем нет. А при закрытии приложения возникает AccessViolation. Настоящие приложение и библиотека более сложные, тут для примера оставил минимум. Первоначально в библиотеке было создание формы. Пробовал передавать в библиотеку Application и Screen. Ошибка при закрытии приложения та же. В итоге создал простые exe и dll, добавил минимум... Ошибка AV при закрытии приложения. В чем дело? Тот же код в VCL работает нормально. 

Главное приложение  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

unit formGetForm;

interface
uses
  System.SysUtils, System.Types, System.Classes, Winapi.Windows,
  FMX.Forms, FMX.Controls, FMX.Controls.Presentation, FMX.Types, FMX.StdCtrls;

type
  P_Get = procedure; safecall;
  TfrmGetForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var frmGetForm: TfrmGetForm;

implementation
{$R *.fmx}

procedure TfrmGetForm.Button1Click(Sender: TObject);
var  hDll:HMODULE;
       F_Get:P_Get;
begin
   if(hDll=0) then
    begin
     hDll:=LoadLibrary('evTestForm.dll');
     F_Get := P_Get(GetProcAddress(hDll,'Get_F'));
     F_Get;
     FreeLibrary(hDll);
     hDll:=0;
    end;
end;

end.

Dll  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
library evTestForm;
uses
  FMX.Dialogs;

{$R *.res}
procedure Get_F;  safecall;
begin
 ShowMessage('+++');
end;

exports   Get_F;

begin
end.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Если заменю  FMX.Dialogs; на  VCL.Dialogs; приложение закрывается без AV. 

 

Изменено пользователем usmanovtt
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Добрый вечер. Спасибо за ссылку. В примере по ссылке идет речь о создании форм в Dll. Это близко к моему вопросу, т.к. у меня задача в создании объектов в Dll, которые потом будут использоваться в приложении. Сразу скажу приложение и dll пишутся в одной среде RAD Studio 10.3, используется FMX 1.6.

Проект давнишний, разработан на Delphi&Builder. Сейчас встала задача переписать под Linux. И в Vcl все работает как надо. Но при использовании FMX возникли проблемы с созданием объектов в dll. В моем приведенном примере вызывается ShowMessage. И Acceess Violation возникает при закрытии приложения. Если не делать FreeLibrary, AV не возникает.  Не хочется думать что FMX настолько сырая..... Что скажете коллеги?

Ссылка на комментарий
  • 0

Доброго дня. Поковырялся я с примером... И обнаружил  что с процедурой в таком виде:

procedure CreateFMXForm; external '..\..\..\FMX\Win32\Debug\FMXDLL.dll';

нет ошибки. Но когда заворачиваешь в LoadLibrary, GetProcAddress и  FreeLibrary, Access Violation  при закрытии приложения тут как тут.

Ссылка на комментарий
  • 0
В 06.03.2023 в 19:11, usmanovtt сказал:

Здравствуйте, коллеги. Использую RAD Studio 10.3 и FMX Linux 1.65.  Столкнулся с проблемой как говорится 'на ровном месте'. Приложение и Dll написаны с использованием FMX. Оставил только минимум (убрал не только функционал но и проверки). Нажатие на кнопку может происходить по несколько раз, проблем нет. А при закрытии приложения возникает AccessViolation. Настоящие приложение и библиотека более сложные, тут для примера оставил минимум. Первоначально в библиотеке было создание формы. Пробовал передавать в библиотеку Application и Screen. Ошибка при закрытии приложения та же. В итоге создал простые exe и dll, добавил минимум... Ошибка AV при закрытии приложения. В чем дело? Тот же код в VCL работает нормально. 

Главное приложение  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

unit formGetForm;

interface
uses
  System.SysUtils, System.Types, System.Classes, Winapi.Windows,
  FMX.Forms, FMX.Controls, FMX.Controls.Presentation, FMX.Types, FMX.StdCtrls;

type
  P_Get = procedure; safecall;
  TfrmGetForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var frmGetForm: TfrmGetForm;

implementation
{$R *.fmx}

procedure TfrmGetForm.Button1Click(Sender: TObject);
var  hDll:HMODULE;
       F_Get:P_Get;
begin
   if(hDll=0) then
    begin
     hDll:=LoadLibrary('evTestForm.dll');
     F_Get := P_Get(GetProcAddress(hDll,'Get_F'));
     F_Get;
     FreeLibrary(hDll);
     hDll:=0;
    end;
end;

end.

Dll  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
library evTestForm;
uses
  FMX.Dialogs;

{$R *.res}
procedure Get_F;  safecall;
begin
 ShowMessage('+++');
end;

exports   Get_F;

begin
end.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Если заменю  FMX.Dialogs; на  VCL.Dialogs; приложение закрывается без AV. 

 

В FMX для работы с диалогами следует использовать FMX.DialogService. В данном случае проблема возникает из-за того, что в библиотеке используется FMX.Dialogs, который может работать некорректно с главным потоком приложения.

uses
  FMX.DialogService;

procedure Get_F;  safecall;
begin
  TDialogService.ShowMessage('+++');
end;

Также обратите внимание, что в вашем примере вы вызываете FreeLibrary(hDll); в блоке условия if, что может привести к проблемам, если библиотека уже была загружена ранее. Вы можете перенести вызов FreeLibrary за пределы блока условия, чтобы быть уверенным, что библиотека будет освобождена, когда ее больше не нужно.

 

Изменено пользователем Martifan
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...