자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi 델파이로 만든 DLL 내부에 FireDAC 콤퍼넌트의 동작
2019.08.08 11:29
개발환경 : Delphi 10.2 / DB: PostgresSQL 8.X / WIndows 10
사용환경 : Windows 10 / Node FFI 이용
DLL 로 만든 프로젝트의 이상 현상입니다.
1. VCL Form 1개를 포함한 DLL 입니다. ( cdecl 방식입니다. )
Form 안에, FireDAC 콤포넌트들과 Edit, Memo 등이 있습니다.
DLL 에 작성된 함수들은 VCL Form 안의 맴버들을 이용해서 자료를 가져오거나 전송하거나 합니다.
--> 다른 윈도우 어플에서 DLL을 Import 해서 사용하면 문제 없이 잘 동작합니다.
--> Node FFI 를 이용해서, 콘솔창이 떠 있는 상태에서 동작을 하면 정상 동작 합니다.
* 단, DLL 로딩 시 반드시..VCL Form 하나를 잠깐 띄웠다가 닫아줘야 정상 동작을 하고
그냥 DLL 만 로딩하면 동작이 되질 않습니다.
* 콘솔창이 안 보이도록 vbs 를 이용해서 실행하면, 동작되지 않습니다.
증상: FireDAC 콤포넌트들이 윈도우 어플에서 Import 할 때는 정상 동작 하지만,
다른 Node FFI 같은 걸로 호출하면 제대로 올라오지 않고, 반드시 VCL Form 을 열었다가 닫아줘야 동작합니다.
2. DataModule 에 FireDAC 콤포넌트들을 만들어 놓고 DLL 을 만들었습니다.
--> 다른 윈도우 어플에이나 Node FFI 같은 걸로 DLL을 Import 하면 동작되지 않습니다.
증상: FireDAC 콤포넌트들이 Import 할 때 제대로 올라오지 않습니다.
3. 순수하게 DLL 외에는 다른 폼이나 Datamodule 을 사용하지 않은 경우
FireDAC 오프젝트들을 전역으로 선언하고,
DLL 의 엔트리 지점 (begin ... end.) 에서 FireDAC 오브젝트들을 create 합니다.
--> 다른 윈도우 어플에서 DLL을 Import 해서 사용하면 문제 없이 잘 동작합니다.
--> Node FFI 를 이용하면 콘솔창 상관 없이 전혀 동작하지 않습니다.
증상: FireDAC 콤포넌트들이 윈도우 어플에서 Import 할 때는 정상 동작 하지만,
Node FFI 같은 것으로 Import 할 때 제대로 올라오지 않습니다.
===================================================================
DLL 프로젝트 안에서 FireDAC 을 이용해서 POstgresSQL DB 에 연결할 때
FireDAC 콤포넌트들이 반드시 GUI 안에 있고, 그 GUI 가 한번 이상 Visible 이 되어야 정상으로 동작이 됩니다.
즉, FireDAC 콤포넌트들이 백그라운드로만 동작되는 Node JS 나 c++ 로 만든 콘솔 어플리케이션에서는
정상적으로 동작되지 않습니다.
그외의 다른 콤포넌트들은 어떤 상황에서든 상관 없이 잘 됩니다.
FireDAC 콤포넌트들이 GUI 환경과 밀접하게 연관이 되어있는 것 같습니다.
1. 혹시, FireDAC 콤포넌트들을 GUI 여부와 상관없이 정상적으로 로드할 수 있는 방법이 없나요 ?
2. FireDAC 과 관련된 이유 같은데, PostgresSQL 과 연결하는 가벼운 다른 방법은 없나요 ?
도움 부탁드립니다.
** Node FFI 내부를 확인해 보니, LoadLibrary 로 DLL 을 호출하는 것 같습니다. 즉, 동적으로 DLL 을 호출할 때
FireDAC 콤포넌트들이 제대로 올라가지 않는 것 같습니다.
중간 자답:
*** 자료를 찾아보니, FireDAC 을 이용해서 콘솔어플리케이션을 만드는 경우, 관련된 DB 커서 동작을 위해
환경에 맞게 UI 라이브러리를 포함해야 한다는 게 있네요.
DLL 파일을 Console 어플리케이션에서 사용하는 것도 해당될 것 같다는 생각이 드네요.
The concept of a wait cursor is abstracted in FireDAC (with the interface IFDGUIxWaitCursor) to work within FireMonkey, VCL and console applications. Therefore there exists different implementation for each kind in different units. Depending on your app-type, you have to choose the appropriate implementation. The designer usually add the right one if you drop a FireDAC component onto a form, frame or datamodule.
- Console: FireDAC.ConsoleUI.Wait
- FMX: FireDAC.FMXUI.Wait
- VCL: FireDAC.VCLUI.Wait
댓글 2
-
험프리
2019.08.13 10:15
-
막스뮐러
2019.09.03 17:32
자답 : 해결 후 정보 공유합니다.
- Console: FireDAC.ConsoleUI.Wait
- FMX: FireDAC.FMXUI.Wait
- VCL: FireDAC.VCLUI.Wait
일반적으로, Windows GUI 환경의 개발에서는 문제가 없지만 콘솔용 어플이나, 혹은 만들고 있는 DLL 을 콘솔 어플에서 사용하려면
반드시 FireDAC.ConsoleUI.Wait 를 포함해야 합니다. 그렇지 않은 경우 동작이 되지 않습니다.
즉, 어플리케이션의 용도에 맞게 FireDAC 의 UI 라이브러리를 추가해줘야 합니다.
Delphi 델파이로 만든 DLL 내부에 FireDAC 콤퍼넌트의 동작
2019.08.08 11:29
개발환경 : Delphi 10.2 / DB: PostgresSQL 8.X / WIndows 10
사용환경 : Windows 10 / Node FFI 이용
DLL 로 만든 프로젝트의 이상 현상입니다.
1. VCL Form 1개를 포함한 DLL 입니다. ( cdecl 방식입니다. )
Form 안에, FireDAC 콤포넌트들과 Edit, Memo 등이 있습니다.
DLL 에 작성된 함수들은 VCL Form 안의 맴버들을 이용해서 자료를 가져오거나 전송하거나 합니다.
--> 다른 윈도우 어플에서 DLL을 Import 해서 사용하면 문제 없이 잘 동작합니다.
--> Node FFI 를 이용해서, 콘솔창이 떠 있는 상태에서 동작을 하면 정상 동작 합니다.
* 단, DLL 로딩 시 반드시..VCL Form 하나를 잠깐 띄웠다가 닫아줘야 정상 동작을 하고
그냥 DLL 만 로딩하면 동작이 되질 않습니다.
* 콘솔창이 안 보이도록 vbs 를 이용해서 실행하면, 동작되지 않습니다.
증상: FireDAC 콤포넌트들이 윈도우 어플에서 Import 할 때는 정상 동작 하지만,
다른 Node FFI 같은 걸로 호출하면 제대로 올라오지 않고, 반드시 VCL Form 을 열었다가 닫아줘야 동작합니다.
2. DataModule 에 FireDAC 콤포넌트들을 만들어 놓고 DLL 을 만들었습니다.
--> 다른 윈도우 어플에이나 Node FFI 같은 걸로 DLL을 Import 하면 동작되지 않습니다.
증상: FireDAC 콤포넌트들이 Import 할 때 제대로 올라오지 않습니다.
3. 순수하게 DLL 외에는 다른 폼이나 Datamodule 을 사용하지 않은 경우
FireDAC 오프젝트들을 전역으로 선언하고,
DLL 의 엔트리 지점 (begin ... end.) 에서 FireDAC 오브젝트들을 create 합니다.
--> 다른 윈도우 어플에서 DLL을 Import 해서 사용하면 문제 없이 잘 동작합니다.
--> Node FFI 를 이용하면 콘솔창 상관 없이 전혀 동작하지 않습니다.
증상: FireDAC 콤포넌트들이 윈도우 어플에서 Import 할 때는 정상 동작 하지만,
Node FFI 같은 것으로 Import 할 때 제대로 올라오지 않습니다.
===================================================================
DLL 프로젝트 안에서 FireDAC 을 이용해서 POstgresSQL DB 에 연결할 때
FireDAC 콤포넌트들이 반드시 GUI 안에 있고, 그 GUI 가 한번 이상 Visible 이 되어야 정상으로 동작이 됩니다.
즉, FireDAC 콤포넌트들이 백그라운드로만 동작되는 Node JS 나 c++ 로 만든 콘솔 어플리케이션에서는
정상적으로 동작되지 않습니다.
그외의 다른 콤포넌트들은 어떤 상황에서든 상관 없이 잘 됩니다.
FireDAC 콤포넌트들이 GUI 환경과 밀접하게 연관이 되어있는 것 같습니다.
1. 혹시, FireDAC 콤포넌트들을 GUI 여부와 상관없이 정상적으로 로드할 수 있는 방법이 없나요 ?
2. FireDAC 과 관련된 이유 같은데, PostgresSQL 과 연결하는 가벼운 다른 방법은 없나요 ?
도움 부탁드립니다.
** Node FFI 내부를 확인해 보니, LoadLibrary 로 DLL 을 호출하는 것 같습니다. 즉, 동적으로 DLL 을 호출할 때
FireDAC 콤포넌트들이 제대로 올라가지 않는 것 같습니다.
중간 자답:
*** 자료를 찾아보니, FireDAC 을 이용해서 콘솔어플리케이션을 만드는 경우, 관련된 DB 커서 동작을 위해
환경에 맞게 UI 라이브러리를 포함해야 한다는 게 있네요.
DLL 파일을 Console 어플리케이션에서 사용하는 것도 해당될 것 같다는 생각이 드네요.
- Console: FireDAC.ConsoleUI.Wait
- FMX: FireDAC.FMXUI.Wait
- VCL: FireDAC.VCLUI.Wait
댓글 2
-
험프리
2019.08.13 10:15
-
막스뮐러
2019.09.03 17:32
자답 : 해결 후 정보 공유합니다.
- Console: FireDAC.ConsoleUI.Wait
- FMX: FireDAC.FMXUI.Wait
- VCL: FireDAC.VCLUI.Wait
일반적으로, Windows GUI 환경의 개발에서는 문제가 없지만 콘솔용 어플이나, 혹은 만들고 있는 DLL 을 콘솔 어플에서 사용하려면
반드시 FireDAC.ConsoleUI.Wait 를 포함해야 합니다. 그렇지 않은 경우 동작이 되지 않습니다.
즉, 어플리케이션의 용도에 맞게 FireDAC 의 UI 라이브러리를 추가해줘야 합니다.
흥미로운 시도를 하고 계시네요^^ 진행하시는 상황이 복잡해 직접적인 도움은 어려울것 같고, 몇가지 의견을 드립니다.
현재 DLL 내에서 FireDAC을 이용해 DB연동이 목적이신 것 같습니다.
목적하신대로 동작하지 않는다면, 디버깅 과정을 통해 어디에서 문제가 생기는지 원인을 먼저 파악하시면 관련 해결책을 좀 더 쉽게 찾을 수 있을 것 같습니다.
(Node FFI로 호출 시 로그를 기록하시거나, Run > Parameters... 에서 Host application을 Node FFI 인스턴스로 지정해 디버깅 해볼 수 있을 것 같습니다.)
우선 질문하신 내용에 추가답변을 드립니다.
* FireDAC은 GUI가 아닌 환경에서 문제없이 로드 및 동작됩니다.
* GUI가 있는 경우(TForm에 포함된 경우) 폼이 정상 생성 되어야 해당 폼에 추가된 컴포넌트들도 정상으로 생성 및 동작합니다.
* 동적으로 FireDAC 컴포넌트를 생성하는 방식을 추천드립니다
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)