![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброе время суток!!!
Есть задача: поместить форму (диалог) в 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
|
||||
|
||||
|
Решения с ходу не дам, но посоветую передавать в dll Application от главного приложения при инициализации dll, потом в ней создавать форму(-ы)
|
|
#3
|
||||
|
||||
|
можно это проще сделать:
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;Поправил код Последний раз редактировалось Yurk@, 06.11.2009 в 18:51. |
|
#4
|
|||
|
|||
|
2 Yurk@:
В функции TAboutDlgForm.CreateParented не совпадают типы TApplication и THWND... Даже если вместо TApplication посылать в функцию дескриптор окна, то проблема осталась... ошибка всеравно вылетает... 2 AleD: Цитата:
|
|
#5
|
||||
|
||||
|
Цитата:
|
|
#6
|
|||
|
|||
|
Не надо в DLL создавать Application.
И присваивать его не надо. Я, как понял, у тебя простая формочка. Создавай ее с родителем Nil, а упоминания Application вообще убери. Если очень хочется пообщаться с Application, то делается это подругому. Код:
{ DLL }
function ShowAboutForm(AHandle : THandle;...) : Boolean;
begin
Application.Handle := AHandle;
...
end;
{ Program }
...
ShowAboutform(Application.Handle,...); |
|
#7
|
|||
|
|||
|
Цитата:
Мне нужно создать модальную форму. а если ее создавать с родителем nil, то при ее создании создается значек на панели задач, вообщем ведет она себя не как диалог!!! Цитата:
Теперь ошибка 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
|
||||
|
||||
|
в dll то создал Application?
|
|
#9
|
|||
|
|||
|
Цитата:
а как его там создать? Разве этого не достаточно? Код:
TAboutDlgForm.Create(Application); |
|
#10
|
||||
|
||||
|
Цитата:
|