|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помещение формы в 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
|
||||
|
||||
Решения с ходу не дам, но посоветую передавать в 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
|
||||
|
||||
можно это проще сделать:
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
|
|||
|
|||
2 Yurk@:
В функции TAboutDlgForm.CreateParented не совпадают типы TApplication и THWND... Даже если вместо TApplication посылать в функцию дескриптор окна, то проблема осталась... ошибка всеравно вылетает... 2 AleD: Цитата:
|
#5
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#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?
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#9
|
|||
|
|||
Цитата:
а как его там создать? Разве этого не достаточно? Код:
TAboutDlgForm.Create(Application); |
#10
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |