자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi DLL 내부에서 FireDAC 을 이용해서 FireBird DB 연결 종료 시
2019.10.22 16:15
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
델파이로 DLL 을 만들어서 Node JS 와 인터페이스 하고 있습니다.
DLL 내부에서, FireDAC 의 FDConnection + FDQuery 콤포넌트를 이용해서 자료를 잘 읽고 쓰고 하고 있습니다.
문제는, 해당 DLL 을 불러다가 사용하는 다른 프로그램을 종료할 때 Runtime ERROR 216 이 발생합니다.
FDConnection 으로 PostgresSql 을 연결해서 사용할 때는 문제가 없는데 FireBird DB 연결 후 종료 시 에러가 발생합니다.
해당 프로그램에서 DB 연결을 끊어놓고 종료를 하면 문제가 발생하지 않는 걸 보아,
예측컨데 DLL 의 FDConnection 을 통해 연결된 FireBird( FDConnection ) 문제로 보입니다.
그래서,
DLLMain 의 DLL_PROCESS_DETACH 이벤트 발생 시 FDConnection을 끊어주는 문장을 실행시켰지만
동작하지 않습니다. 모래시계가 잠깐 나오다가..DLL 은 종료가 되지만 DLL을 호출한 프로그램은 런타임오류가 발생합니다.
혹시, FireBird 와 관련해서 다르게 해야하는 것이 있는 지 도움 부탁드립니다.
-------------- DLLMAIN 이벤트 처리 내용 -----------------
procedure DllMain(dwReason: DWORD);
begin
case dwReason of
// process attaches = 1
DLL_PROCESS_ATTACH: begin
OutputDebugString('Process Attach!');
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
end;
// thread attaches = 2
DLL_THREAD_ATTACH: begin
OutputDebugString('Thread Attach');
end;
// thread detaches = 3
DLL_THREAD_DETACH: begin
OutputDebugString('Thread Detach');
end;
// process detaches = 0
DLL_PROCESS_DETACH: begin
FDConnection1.Close; <---------------- 동작이 되지 않습니다. 또는 FDConnection1.Connected := False; 도 동작하지 않습니다.
OutputDebugString('Detach!'); ( FireBird 에서만 안됩니다. PostgresSql 은 이상이 없습니다. )
CoUninitialize;
end;
end;
end;
댓글 2
Delphi DLL 내부에서 FireDAC 을 이용해서 FireBird DB 연결 종료 시
2019.10.22 16:15
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
델파이로 DLL 을 만들어서 Node JS 와 인터페이스 하고 있습니다.
DLL 내부에서, FireDAC 의 FDConnection + FDQuery 콤포넌트를 이용해서 자료를 잘 읽고 쓰고 하고 있습니다.
문제는, 해당 DLL 을 불러다가 사용하는 다른 프로그램을 종료할 때 Runtime ERROR 216 이 발생합니다.
FDConnection 으로 PostgresSql 을 연결해서 사용할 때는 문제가 없는데 FireBird DB 연결 후 종료 시 에러가 발생합니다.
해당 프로그램에서 DB 연결을 끊어놓고 종료를 하면 문제가 발생하지 않는 걸 보아,
예측컨데 DLL 의 FDConnection 을 통해 연결된 FireBird( FDConnection ) 문제로 보입니다.
그래서,
DLLMain 의 DLL_PROCESS_DETACH 이벤트 발생 시 FDConnection을 끊어주는 문장을 실행시켰지만
동작하지 않습니다. 모래시계가 잠깐 나오다가..DLL 은 종료가 되지만 DLL을 호출한 프로그램은 런타임오류가 발생합니다.
혹시, FireBird 와 관련해서 다르게 해야하는 것이 있는 지 도움 부탁드립니다.
-------------- DLLMAIN 이벤트 처리 내용 -----------------
procedure DllMain(dwReason: DWORD);
begin
case dwReason of
// process attaches = 1
DLL_PROCESS_ATTACH: begin
OutputDebugString('Process Attach!');
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
end;
// thread attaches = 2
DLL_THREAD_ATTACH: begin
OutputDebugString('Thread Attach');
end;
// thread detaches = 3
DLL_THREAD_DETACH: begin
OutputDebugString('Thread Detach');
end;
// process detaches = 0
DLL_PROCESS_DETACH: begin
FDConnection1.Close; <---------------- 동작이 되지 않습니다. 또는 FDConnection1.Connected := False; 도 동작하지 않습니다.
OutputDebugString('Detach!'); ( FireBird 에서만 안됩니다. PostgresSql 은 이상이 없습니다. )
CoUninitialize;
end;
end;
end;
등록한 내용으로 보아 DLLMain 종료 시(DLL detach 시) FireDAC 연결을 해재하지 못하고 종료되는 것으로 보입니다.
(정확히 확인하지 못한 의견입니다. 참고만 부탁드립니다.)
( FireBird 에서만 안됩니다. PostgresSql 은 이상이 없습니다. ) => DBMS 별로 연결 종료하는 방식이 다를 수 있을 것 같습니다.
DB 연결을 끊어놓고 종료를 하면 문제가 발생하지 않는 걸 보아, => 그렇다면, DLL에 명시적으로 Unload 등의 함수를 추가로 Export하고 종료 전 호출하도록 절차를 제시하면 어떨까요? 다른 DLL 들도 많이 사용하는 방식입니다.
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)