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

delphi PostMessage를 이용한 프로그램사이의 메시지 전달하기..

by 메르세데쓰 2015. 7. 13.
반응형

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


델파이로  개발하다보니 program끼리 정보를 전달해야하는 경우가 간혹 있을때가 있는데 이런 경우의 하나의 해결방법이 될 것 같아서 소개하려고 합니다.


예를들어 이런것이죠..

A와 B라는 프로그램사이에 소통입니다.   A에서 어떤 버튼을 눌렀을때.. B에 관련된 정보가 연관되어 실행이되는거죠..


여러가지 방법이 있을 법도한데..   DB를 이용한다던가 INI파일을 서로 참조해서 확인한다던가 처럼요..



물론 SendMessage, PostMessage를 이용하여 처리할 수 있는 방법도 있죠.. 지금시간 설명드릴려고 하는것이고요..



각자의 장단점이 있습니다. 하지만 제가 봤을때 제일 큰 차이점을 찾는다면..  비동기적으로 응답이 가능한지 안한지?  인것같습니다. 


위에 나열한 메시지를 이용한 방법이 아니라면.. 응답이 왔는지 안왔는지를 주기적으로 체크해야하는 로직이 필요합니다.  길게는 몇초마다 한번씩이 될 수도있고 아니면 그보다 훨씬 짧은시간내 체크해야하는 경우도 있겠죠..


대상이 내 pc가 아니라 다른곳에 있는 네트워크에 물려있는 장비로 확대가된다면.. 쉽지 않을 것 같습니다.   내 컴퓨터에서 돌리는 델파이로 만든 두개의 프로그램으로 적용범위를 한정짓는다면 유용한 Program을 만들 수 있지 않을까 생각합니다.



서두가 길었네요..


B에서 호출한DLL폼에서 특정 버튼을 눌렀을때  A프로그램의 특정 창이 열리게하는것을 해보려고합니다.

아래와 같은 형태가 되겠죠...


A.exe    <--------------  B.exe<--[ DLL폼 ] 

*조건에 따라 1번창 ,2번창이 열린다.



공통적으로 필요한 것은   호출하는곳과 실행될곳에 아래처럼 동일한 주소를 갖는 값을 상수로 선언해주셔야합니다.


const WM_USER



1.PostMessage 전송부분 (b program)

  

  위에서 선언했었던 값을 (MY_MESSAGE) 아래처럼 메시지 함수에 넣어주시고..  itxt에 전송할 값을 넣습니다.


 PostMessage( [보낼프로그램의핸들값], 메시지(Cardinal), 0 , param(전송할 메시지 : integer형) );

  

PostMessage custom


물론 두번째 인자에 WM_CLOSE와 같은 예약되어있는 값들도 있긴합니다..   


아래와 같은 처리로  특정프로그램을 간단하게 종료시켜버릴 수 있죠


SendMessage([타겟프로그램핸들], WM_CLOSE,0,0); 


내가 원하는 방식으로 프로그래밍을 하는게 곤란한다면.. 특정 숫자를 포스트메시지에 하였을 경우 동작하게 하는 방법이 수월하겠죠..


한가지 의해해 하실 것도 같은데요.. FindWindow를 사용하지 않고 FileExist('해당파일).. 이런식으로 전달하려는 프로그램의 핸들값을 넣는부분을 처리했는데요..   Caption부분이 사용자에 따라 달라지는 방식으로 구동되어서.. 실행시 파일로 메인폼의 handle값을 파일로 떨구는 것으로 처리한 것입니다.



여기에서 중요한 점은 소스 길이를 줄여보려고  strtoint(txt) 처럼 형변환을 바로해서 PostMessage에 넣어버리는경우 간혹 버그로 인해 정확한 값이 전달이 안될 수 있다는 것입니다.  (제가 사용하는 delphi6이 그렇습니다.)


2.수신부분 (a program)

수신부분도 마찬가지로..   MY_MESSAGE = WM_USER + 101;  이렇게 동일하게 상수로 선언해주시고요..

아래와 같이 procedure를 만들어주세요...

PostMessage receive


그리고.. 저는 조건에 따라서  서로 다른 창을 띄우도록 하려고 소스를 조금 수정해 봤습니다.


신기한 것은..    버튼클릭과 같은 Action을 주지 않아도..    B라는 프로그램에서 메시지를 보내주면.. 바로 응답한다는 것입니다.


PostMessage receive2




이상으로 delphi PostMessage를 이용한 프로그램사이의 메시지 전달하는 방법에 대해 알아봤습니다.





반응형

댓글