![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подключение к 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