Форум: "Начинающим";
Текущий архив: 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:="Àâòîðèçàöè 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:="Àâòîðèçàöè 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