Форум: "Базы";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
ВнизПодключение к Oracle 10g в библиотеке Найти похожие ветки
← →
tytus © (2007-01-23 16:14) [0]Доброго дня мастера. В главной программе вызываю длл-ку, в которой при создании формы подключаюсь к ораклу
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, то все нормально, но сие неправильно имхо...
Как сделать толково?
← →
Desdechado © (2007-01-23 16:41) [1]try-finally неплохо бы вставить
и протрассировать работу DLL
← →
tytus © (2007-01-23 17:26) [2]>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 17:41) [3]1. Не вижу описания типов.
2. Не понятно, откуда взят приведенный код.
3. Почему бы подключение ни сделать ДО создания формы. И при удаче создавать форму, а принеудаче - потстреливаться назад.
> В главной проге трай-файнали не помогает.
Не помогает от чего? Он нужен, чтобы выгрузка библиотеки происходяла в любом случае, а не в случае успешного вызова функции.
← →
tytus © (2007-01-23 17:53) [4]>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 19:10) [5]
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-24 09:16) [6]>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?!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.045 c