Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подключение к Oracle 10g в библиотеке [D7]


tytus ©   (2007-01-23 16:14:00) 

Доброго дня мастера. В главной программе вызываю длл-ку, в которой при создании формы подключаюсь к ораклу
OracleSession1.LogOn; Форма модальная. В обработчике OnClose
делаю OracleSession1.logOf;
При повторном вызове библиотеки появляется ошибка:
<EOracle Error with message "".>
Вот текст основной программы:
procedure TMainFm.ReportSelectExecute(Sender: TObject);
var
 LibHandle:THandle;
 ShowRepParamsFm:TShowRepParamsFm;
begin
LibHandle:=LoadLibrary('TGCompRpt.dll');
if LibHandle=0 then
begin
 Raise Exception.Create('Could not load TGCompRpt.dll');
 Exit;
end;
@ShowRepParamsFm:=GetProcAddress(LibHandle,'ShowRepParamsFm');
if not(@ShowRepParamsFm=nil) then
begin
 ShowRepParamsFm(Handle);
end;
FreeLibrary(LibHandle);
end;
Если вместо FreeLibrary делать LibHandle:=0, то все нормально, но сие неправильно имхо...
Как сделать толково?


tytus   (2007-01-24 09:16:00) [1]

>Desdechado ©   (23.01.07 19:10) [5]
procedure ShowRepParamsFm(AHandle:THandle);
var
 RepParamsFm: TRepParamsFm;
begin
Application.Handle:=AHandle;
RepParamsFm:=TRepParamsFm.Create(Application);
try
 RepParamsFm.ShowModal;
finally
 RepParamsFm.OS1.LogOff;
 FreeAndNil(RepParamsFm);
end;
OS1- TOracleSession;
С этим вариантом тоже не проходит.
Может вся фигня в том, что на моей тачке XP SP2, а сам Оракл работает под управлением 2000?!


Desdechado   (2007-01-23 19:10:00) [2]

procedure ShowRepParamsFm(AHandle:THandle);
var
RepParamsFm: TRepParamsFm;
begin
Application.Handle:=AHandle;
RepParamsFm:=TRepParamsFm.Create(Application);
RepParamsFm.ShowModal;
end;

Тут утечка памяти, бесхозное соединение с Ораклом после закрытия формы и непонятное поведение Application.Handle (т.к. не восстановлено в оригинальное значение)

> юзесы, типы... и т.д.
И где описано OS1

> почему LibHndle:=0 устраняяет ошибку
Не устраняет, а маскирует и отодвигает "на потом".


tytus   (2007-01-23 17:53:00) [3]

>Desdechado ©   (23.01.07 17:41) [3]
текст ДЛЛ
юзесы, типы... и т.д.

procedure ShowRepParamsFm(AHandle:THandle);

{var
 RepParamsFm: TRepParamsFm;}

implementation

{$R *.dfm}

procedure ShowRepParamsFm(AHandle:THandle);
var
 RepParamsFm: TRepParamsFm;
begin
Application.Handle:=AHandle;
RepParamsFm:=TRepParamsFm.Create(Application);
RepParamsFm.ShowModal;
end;

Далее текст OnCreate из [2]

Основная прога

type
 TShowrepParamsFm=procedure(AHandle:THandle);

Далее идет описание из вопроса.

> Не помогает от чего? Он нужен, чтобы выгрузка библиотеки происходяла в любом случае, а не в случае успешного вызова функции.

да понятно это, непонятно почему ПЕРВЫЙ раз коннектится, а ПОСЛЕДУЮЩИЕ разы - ошибка! И почему LibHndle:=0 устраняяет ошибку, и какие последствия будут (память не вернется системе, что-ли, а если приложение закрыть, то память вернется?)


Desdechado   (2007-01-23 17:41:00) [4]

1. Не вижу описания типов.
2. Не понятно, откуда взят приведенный код.
3. Почему бы подключение ни сделать ДО создания формы. И при удаче создавать форму, а принеудаче - потстреливаться назад.

> В главной проге трай-файнали не помогает.
Не помогает от чего? Он нужен, чтобы выгрузка библиотеки происходяла в любом случае, а не в случае успешного вызова функции.


tytus   (2007-01-23 17:26:00) [5]

>Desdechado ©   (23.01.07 16:41) [1]
procedure TRepParamsFm.FormCreate(Sender: TObject);
var
 ST:_SYSTEMTIME;
 DT:TDateTime;
 SqlStmt:string;
 LCount:integer;
begin
try
OS1.LogOn;//<--сюда ругается...
except
 MessageBox(Handle,PChar(OS1.ErrorMessage(OS1.ReturnCode)),
   'Ошибка подключения',MB_OK+MB_SYSTEMMODAL);
 ModalResult:=mrOK;  
end;
SB1.Panels[0].Text:=OS1.LogonUsername;
SB1.Panels[1].Text:=OS1.LogonDatabase;

В главной проге трай-файнали не помогает... и не помогало, потому и убрал за ненадобностью.


Desdechado   (2007-01-23 16:41:00) [6]

try-finally неплохо бы вставить
и протрассировать работу DLL


Наверх

Титульная страница Поиск, карта сайта Написать письмо