본문 바로가기
프로그래밍/delphi

delphi exe와 프로그램안에 embadded된 dll프로그램간의 상호간 제어하기

by 메르세데쓰 2015. 4. 11.
반응형

안녕하세요 메르세데스입니다.


지난 시간에 메인 프로그램의 특정 패널이나 탭안에 dll 폼을  집어 넣는 방법에 대해 진행을 했었는데요..    


결과적으로 성공을 하였지만  상호 간의 data 교환 이라던가 이벤트전달과 같은 연결 고리를 만드는 방법에 이 쉽지 않다는 것을 알게 되었는데요.  간단하지는 않지만 연결하는 방법을 알아보려고 합니다.


같은 Form 안에 있는 것이 아닌 쉽게 이야기 해서 임차인과 임대인의 관계와 비슷하다고 보입니다    그래서 껍데기는 있지만 안에 있는 내용은 다른 모듈인 것 이죠..  바로 옆에 버튼이 있지만..  가깝지만 먼 버튼이라 제어가 쉽지 않다는 것입니다.


MODAL폼이 아니라면 상호간의 연관성이 분명..필요할 수 있거든요


하지만 이런저런 테스트를 해보니 역시 안되지는 않습니다. 다만 좀 코드가 길어지는 것 외에는요.. 훌륭한 프로그래머는 간결한 코드가 생명인데..ㅜㅜ



제 선에서 생각해본 방법은 2가지 입니다. 물론 이게 정답은 아닙니다! 참고만 해주세요..


1.exe -> dll제어 

   1) Handle값을 이용한 방법

   2) dll쪽에 이벤트 전달을 위한 function을 만드는 방법


2.dll -> exe 제어

   1) Handle값을 이용한 방법



* exe 에서 제어하는 방법은 2가지 인데요.. 


  첫번째는  DLL폼을 호출하여 패널에 붙일 때  제어가 필요한 것들의 핸들값을 함수의 리턴값으로 가져오는 방법이 입니다.


테스트해보니 FormCreate 아래에.. return 을 받으면  값이 안 들어 옵니다.


Function  Show_CHEMO_ORDR2(var btnHandle: THandle): TForm;StdCall;

begin

    AAA:= TAAA.Create(AAA);

    btnHandle   := AAA.BitBtn1.Handle;  // 결과가 0으로 들어옵니다.

    Result := MOCHEMS1;

end;



네... 폼이 생성될 때  Create -> Show 이런 식으로 진행되는데   OnShow에서 Handle이 만들어지기 때문입니다.


하지만 방법이 없는 것은 아니죠?   위에 로직은 dll-Form을 생성하는 용도로만 사용하고..   핸들값만 받는 함수를 만들어 받으면 됩니다. 


//DLL내에 별도로 핸들값만 리턴해는 함수를 구현해준다.


Function  ShowLOAD_BTN_HANDLE: THandle;StdCall;

begin

          if AAA <> nil then

             Result := AAA.BitBtn1.Handle;

          else

            Result := false;


end;


정리하자면.. 함수 2개를 돌려서..위엣것은 폼을 생성하는 것에.. 아랫것은..Handle값을 가져오는 것으로 하면 되는 것이죠..이렇게 가져온 HANDLE값을 SENDMESSAGE를 이용해서 처리해주면 됩니다.



두번째는... 그냥.. 어떠어떠한 일을 진행하라는 Function을 만드는 것입니다.  


그냥 아래처럼 만들어서 EXE프로그램내 버튼에 만들어 해당함수를 CALL하면.. DLL-Form의 해당 버튼이 클릭 됩니다.

이곳에 저장 로직이라던가 수정로직 .. 원하고자 하는 걸 구현하면 됩니다.    훨씬 간단하죠..


//DLL내에 이런 함수를 만들어 놓는다.


Function  Show_DLL_bTL_CLK: Boolean;StdCall; 

begin

          if AAA <> nil then

          begin

             AAA.RzBitBtn1aab.Click;

             Result := true;

          end

          else

            Result := false;

end;



이제 반대에서 제어하는 방법을 알아보겠습니다.


* dll에서 exe를 제어하는 방법은 제가 파악한 건 1가지 입니다. 


[DLL]이란, 메인 프로그램의 호출을 받는 형태 이기 때문에 Function type으로 결과를 리턴받는 방식이 있긴 하지만  이것도 함수 특성상 종료시 리턴되는 것이기 때문에 쉽지 않아 보입니다.


하지만 결과적으로는 ... Handle값만 알고 있다면 다 되는 것 같습니다.  근데 찾는 방법에는 문제가 있네요..


FindWindow나 FindWindowEx를 이용해서 핸들을 찾는 방법이 있다고 하는데 잘 안됩니다. 자기 폼 내에 것만 되죠..  그래서 제가 내린 결론은..  dll폼을 호출할때 제어가 필요한 버튼이나 이벤트에 관련된 메인폼의 Handle값을 함수에 담에 보내는 것입니다. 그리고 SendMessage를 이용해서 처리하는 것이죠..  


아래는 마우스버튼클릭을 SendMessage로 처리하는 방법입니다.


SendMessage( [전달받은handle], WM_LBUTTONDOWN,0,0 );

SendMessage( [전달받은handle], WM_LBUTTONUP,0,0 );



물론 이게 100% 정답은 아닙니다.  제 수준에서 파악한 정도일 뿐이죠..    혹시 저랑 비슷한 고민이 있으신 분들께 조그마한 도움이 되었으면 하는 바램입니다.


더욱 효율적인 방법이 있으시면 조언 부탁 드립니다


이상으로 delphi exe프로그램과 embadded된 dll프로그램간의 상호간 제어하는 방법에 대해 알아봤습니다. 감사합니다.






반응형

댓글