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