![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при после вызова формы из DLL [D7, WinXP]
Lamer666 © (2008-01-01 16:13:00)При многократном вызове модальной формы АВТОРИЗАЦИИ из 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;
СПАСИБО!
Anatoly Podgoretsky (2008-01-02 01:44:00) [1]> Lamer666 (01.01.2008 23:01:28) [28]
Везде BPL, пока не будешь делать межплатформенную реализацию ДЛЛ
А когда будешь делать, то никаких строк и классов, только простые типы, не выше СИ
Sergey Masloff (2008-01-01 23:33:00) [2]Lamer666 (01.01.08 23:01) [28]
>Так где же лучше использовать DLL а где BPL?
Везде где используется VCL, как правило, лучше использовать BPL.
Lamer666 (2008-01-01 23:01:00) [3]
> Anatoly Podgoretsky © (01.01.08 22:55) [27]
Так где же лучше использовать DLL а где BPL?
Anatoly Podgoretsky (2008-01-01 22:55:00) [4]> Lamer666 (01.01.2008 20:57:21) [21]
> Кстати, сейчас убрал все Button-ы из формы в DLL и все работает как часы...8)
Это временно
Lamer666 (2008-01-01 22:43:00) [5]А как загрузить DLL ку загрузить в память? Скоприровать в System32 и перезагрузить машину?
Или есть более оперативный метод?
Lamer666 (2008-01-01 22:31:00) [6]
> у меня вообще делает всегда только то что скажу... ;)
: ))
sniknik (2008-01-01 22:15:00) [7]а хто тебя знает... у меня не возникает. у меня вообще делает всегда только то что скажу... ;)
Lamer666 (2008-01-01 22:00:00) [8]Но почему при добалении КНОПКИ возникает ОШИБКА?
sniknik (2008-01-01 21:28:00) [9]> Таже ошибка! : ((
значит не только в показанном коде тв даешь ссылки на область памяти dll, которые "теряются" с выгрузкой.
> сейчас убрал все Button-ы из формы в DLL и все работает как часы...8)
ну, вот значит гдето там оно и было.
Lamer666 (2008-01-01 20:57:00) [10]
> Формы в DLL -зло :)
Да? Может и вправду BPL?
Кстати, сейчас убрал все Button-ы из формы в DLL и все работает как часы...8)
{RASkov} (2008-01-01 20:52:00) [11]> [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:51:00) [12]
> MetalFan © (01.01.08 20:46) [18]
Спасибо!
MetalFan (2008-01-01 20:46:00) [13]
> > лучше уж bpl тогда.
>
> Что ЭТО?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274
Lamer666 (2008-01-01 20:45:00) [14]
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;
Таже ошибка!: ((
{RASkov} (2008-01-01 20:35:00) [15]> function CreateTheForm(const APP: TApplication.....): Boolean;
Замени на свое:
> Function LogInSQLForm(App:Tapplication; LCaption: PChar): PChar; Stdcall; Export;
{RASkov} (2008-01-01 20:33:00) [16]> [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 - только не забудь....
Lamer666 (2008-01-01 20:25:00) [17]
> Ну ты где его меняешь? Вот там и назад возвращай при закрытии
> формы....
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:21:00) [18]> [12] Lamer666 (01.01.08 20:18)
> И где (в dll-ке или в приложении)?
Ну ты где его меняешь? Вот там и назад возвращай при закрытии формы....
Lamer666 (2008-01-01 20:18:00) [19]
> А назад Хэндл возвращаешь?
Очевидно что НЕТ, не возвращаю, а как его вернуть? И где (в dll-ке или в приложении)?
{RASkov} (2008-01-01 20:13:00) [20]> [9] Lamer666 (01.01.08 20:09)
Хэндл верни :)