Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.01.27;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при после вызова формы из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
1-1193170131
3Lander
2007-10-24 00:08
2008.01.27
цвет UpDown


2-1199285953
Stepper
2008-01-02 17:59
2008.01.27
Печать содержимого TRxRichEdit ?


15-1198357495
niKo
2007-12-23 00:04
2008.01.27
OPERA


15-1198157501
Ins
2007-12-20 16:31
2008.01.27
Delphi Puzzles


2-1198764407
Artem
2007-12-27 17:06
2008.01.27
Files and strings





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский