Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

Ошибка при после вызова формы из DLL   Найти похожие ветки 

 
Lamer666   (2008-01-01 16:13) [0]

При многократном вызове модальной формы АВТОРИЗАЦИИ из dll после закрытия своего приложения я получаю ошибку:
Project admin.exe raised too many consecutive exception: "access violation at 0x00333162: read of adrress 0x00b886ac".
А если в форму АВТОРИЗАЦИИ добаляю кнопки, то после закрятия своего приложения я получаю ошибку:
Инструкция по адресу "0x00333162" обратилась к памяти по адресу "0x00b7583c". Память на может быть "read". А потом форму с заголовком Error и сообщением Runtime error 216 at 00333162.

Помогите!

Форму в DLL запускаю так:

Function LogInSQLForm(const App:Tapplication):PChar;Stdcall;Export;
   Begin
   Application.Handle :=App.Handle;
   Form1:= TForm1.Create (Application.MainForm);
   Form1:=TForm1.Create(App);
   Form1.Caption:="Авторизация";
   Form1.ShowModal;
     If Form1.Tag=1 Then
     begin
     Result:=PChar("Provider=SQLOLEDB.1;Password="+Form1.MaskEdit1.Text+";Persist Security Info=True;User ID="+Form1.Edit3.Text+";Initial Catalog="+Form1.Edit2.Text+";Data Source="+Form1.Edit1.Text);
     end
     Else Result:=PChar("");
     End;

СПАСИБО!


 
MetalFan ©   (2008-01-01 17:29) [1]

передавай просто хэндл, зачем ссылку на объект давать?

>    Form1:= TForm1.Create (Application.MainForm);
>    Form1:=TForm1.Create(App);

это что за ерунда? зачем 2 раза создавать?
отдай в owner просто nil. только сам тогда убей ее.


 
sniknik ©   (2008-01-01 17:30) [2]

в коде 3 ошибки
1 - глобальная, сама идея держать форму в dll...
2 - форма создается но не уничтожается (железное правило "создал?-уничтожь!" и именно в той области где создавал, исключения редки.)
3 - работа с PChar, передается указатель на локальную строку в dll, т.е. указатель в программе будет на чужую область памяти... или на свою, если менеджер памяти общий, но если так, то тогда зачем PChar? передавай строку. (кстати общий менеджер просто необходим изза работы с формой/Application)

и одна несуразность
> Form1.Tag=1
? только что делал ShowModal, проигнорировал ModalResult, только для того чтобы "изобрести" собственный велосипед(аналог)?


 
sniknik ©   (2008-01-01 17:31) [3]

> это что за ерунда? зачем 2 раза создавать?
упс. просмотрел. 4 ошибки.


 
MetalFan ©   (2008-01-01 18:53) [4]


> форма создается но не уничтожается

а может у него CloseAction = caFree?
))


 
Lamer666   (2008-01-01 19:43) [5]


> MetalFan ©   (01.01.08 17:29) [1]

Сейчас исправлю и попробую!

> 1 - глобальная, сама идея держать форму в dll...

Почему? На мой взгляд у добно. Нужно что то изменить, взял переделал DLL-ку и скопировал в рабочий каталог, т.е. "ВОЗМОЖНОСТИ" проекта можно определять по средствам DLL-к..
> а может у него CloseAction = caFree?
 НЕТ просто CLOSE.


 
MetalFan ©   (2008-01-01 19:46) [6]


> Почему? На мой взгляд у добно.

тянет за собой лишний размер.
лучше уж bpl тогда.


 
Lamer666   (2008-01-01 19:48) [7]


> лучше уж bpl тогда.

Что ЭТО?


 
Lamer666   (2008-01-01 19:58) [8]


> отдай в owner просто nil. только сам тогда убей ее.

Если так, то форма из ДЛЛ имеет свою кнопку на панели задач


 
Lamer666   (2008-01-01 20:09) [9]

Function LogInSQLForm(App:Tapplication;LCaption:PChar):PChar;Stdcall;Export;
   Begin
   Application.Handle :=App.Handle;
   Form1:=TForm1.Create(Application);
   Form1.Caption:="Àâòîðèçàöè&#25 5;: "+StrPas(LCaption);
   Form1.RxLabel1.Caption:=StrPas(LCaption);
   Form1.ShowModal;
     Result:=PChar("Provider=SQLOLEDB.1;Password="+Form1.MaskEdit1.Text+";Persist Security Info=True;User ID="+Form1.Edit3.Text+";Initial Catalog="+Form1.Edit2.Text+";Data Source="+Form1.Edit1.Text);
     End;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=CaFree;
end;


Ошибка ПО ПРЕЖНЕМУ ПОЯВЛЯЕТЬСЯ : (((


 
{RASkov} ©   (2008-01-01 20:13) [10]

> [0] Lamer666   (01.01.08 16:13)
> Function LogInSQLForm(const App:Tapplication):PChar;Stdcall;
> Export;
>   Begin
>   Application.Handle :=App.Handle;

А назад Хэндл возвращаешь?


 
{RASkov} ©   (2008-01-01 20:13) [11]

> [9] Lamer666   (01.01.08 20:09)

Хэндл верни :)


 
Lamer666   (2008-01-01 20:18) [12]


> А назад Хэндл возвращаешь?

Очевидно что НЕТ, не возвращаю, а как его вернуть? И где (в dll-ке или в приложении)?


 
{RASkov} ©   (2008-01-01 20:21) [13]

> [12] Lamer666   (01.01.08 20:18)
> И где (в dll-ке или в приложении)?

Ну ты где его меняешь? Вот там и назад возвращай при закрытии формы....


 
Lamer666   (2008-01-01 20:25) [14]


> Ну ты где его меняешь? Вот там и назад возвращай при закрытии
> формы....


Function LogInSQLForm(App:Tapplication;LCaption:PChar):PChar;Stdcall;Export;
   Begin
   Application.Handle :=App.Handle;
   Form1:=TForm1.Create(Application);
   Form1.Caption:="Àâòîðèçàöè&#25 5;: "+StrPas(LCaption);Form1.RxLabel1.Caption:=StrPas(LCaption);
   Form1.ShowModal;
     If Form1.Tag=1 Then
     begin
     Result:=PChar("Provider=SQLOLEDB.1;Password="+Form1.MaskEdit1.Text+";Persist Security Info=True;User ID="+Form1.Edit3.Text+";Initial Catalog="+Form1.Edit2.Text+";Data Source="+Form1.Edit1.Text);
     end
     Else Result:=PChar("");
   App.Handle:=Application.Handle;
   End;


?


 
{RASkov} ©   (2008-01-01 20:33) [15]

> [14] Lamer666   (01.01.08 20:25)

Наоборот :)

Вот примерно так попробуй:

var OLDHND: THandle;
function CreateTheForm(const APP: TApplication.....): Boolean;
begin
 OLDHND:=Application.Handle;
 Application.Handle:=APP.HAndle;  
 Application.CreateForm(ТForm1, Form1);
 if Form1.ShowModal=1 then ShowMessage("Форма закрыта с результатом "Ok"");
 Form1.Free;
 Application.Handle:=OLDHND;
end;

try - только не забудь....


 
{RASkov} ©   (2008-01-01 20:35) [16]

> function CreateTheForm(const APP: TApplication.....): Boolean;

Замени на свое:

> Function LogInSQLForm(App:Tapplication; LCaption: PChar): PChar; Stdcall; Export;


 
Lamer666   (2008-01-01 20:45) [17]

Function LogInSQLForm(App:TApplication;LCaption:PChar):PChar;Stdcall;Export;
Var OLDHND: THandle;
   Begin
   OLDHND:=Application.Handle;
   Application.Handle :=App.Handle;
   Form1:=TForm1.Create(Application);
   If Form1.ShowModal=1 then ShowMessage("Ôîðìà çàêðûòà ñ ðåçóëüòàòîì "Ok"");
   Form1.Free;
   Application.Handle:=OLDHND;
   End;

Таже ошибка! : ((


 
MetalFan ©   (2008-01-01 20:46) [18]


> > лучше уж bpl тогда.
>
> Что ЭТО?

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274


 
Lamer666   (2008-01-01 20:51) [19]


> MetalFan ©   (01.01.08 20:46) [18]

Спасибо!


 
{RASkov} ©   (2008-01-01 20:52) [20]

> [17] Lamer666   (01.01.08 20:45)
> Таже ошибка! : ((

Формы в DLL -зло :)

Вот так еще попробуй:
library YourLib;
uses
 SysUtils, Windows, UBegForms, Forms, UAftForms.....;


Вот модули:
--------------------------------
unit UBegForms;
interface
uses Windows;

var RealHInstance: LongWord;

implementation

initialization
RealHInstance:=HInstance;
HInstance:=GetModuleHandle(nil);
end.


-----------------------------------
unit UAftForms;
interface
uses Windows, UBegForms;

implementation

initialization
HInstance:=RealHInstance;
end.


 
Lamer666   (2008-01-01 20:57) [21]


> Формы в DLL -зло :)

Да? Может и вправду BPL?

Кстати, сейчас убрал все Button-ы из формы в DLL и все работает как часы...8)


 
sniknik ©   (2008-01-01 21:28) [22]

> Таже ошибка! : ((
значит не только в показанном коде тв даешь ссылки на область памяти dll, которые "теряются" с выгрузкой.

> сейчас убрал все Button-ы из формы в DLL и все работает как часы...8)
ну, вот значит гдето там оно и было.


 
Lamer666   (2008-01-01 22:00) [23]

Но почему при добалении КНОПКИ возникает ОШИБКА?


 
sniknik ©   (2008-01-01 22:15) [24]

а хто тебя знает... у меня не возникает. у меня вообще делает всегда только то что скажу... ;)


 
Lamer666   (2008-01-01 22:31) [25]


> у меня вообще делает всегда только то что скажу... ;)

: ))


 
Lamer666   (2008-01-01 22:43) [26]

А как загрузить DLL ку загрузить в память? Скоприровать в System32 и перезагрузить машину?
Или есть более оперативный метод?


 
Anatoly Podgoretsky ©   (2008-01-01 22:55) [27]

> Lamer666  (01.01.2008 20:57:21)  [21]

> Кстати, сейчас убрал все Button-ы из формы в DLL и все работает как часы...8)

Это временно


 
Lamer666   (2008-01-01 23:01) [28]


> Anatoly Podgoretsky ©   (01.01.08 22:55) [27]

Так где же лучше использовать DLL а где BPL?


 
Sergey Masloff   (2008-01-01 23:33) [29]

Lamer666   (01.01.08 23:01) [28]
>Так где же лучше использовать DLL а где BPL?
Везде где используется VCL, как правило, лучше использовать BPL.


 
Anatoly Podgoretsky ©   (2008-01-02 01:44) [30]

> Lamer666  (01.01.2008 23:01:28)  [28]

Везде BPL, пока не будешь делать межплатформенную реализацию ДЛЛ
А когда будешь делать, то никаких строк и классов, только простые типы, не выше СИ



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.015 c
2-1198778448
art36
2007-12-27 21:00
2008.01.27
Как реализовать процесс вставки данных в браузер? Точнее...


15-1197887433
Дмитрий
2007-12-17 13:30
2008.01.27
Пожалуйста помогите с Pascal


15-1198253797
Админ
2007-12-21 19:16
2008.01.27
Установка компонент Developer Express


11-1182849398
robt
2007-06-26 13:16
2008.01.27
колесо и TrackBar


2-1198874994
Efir
2007-12-28 23:49
2008.01.27
DoubleClick в OpenDialog