IPC (Inter Process Communication)

 사용자의 요구가 증대되면서 프로그램이 갖춰야 할 기능 또한 많아지고 당연히 프로그램 크기도 비대해졌다. 또한 하나의 프로그램만으로는 사용자의 욕구를 충족시키지 못해 여러개의 프로그램을 만들어야 하는 상황이 발생하고 있다. 여기서 서로 다른 프로그램 (엄밀히 얘기하면 프로세스)들간에 데이터를 교환하거나 특정 기능을 사용하려면 어떻게 해야 할까? 이런 문제를 해결하기 위한 것이 다음에 소개되는 IPC 기술(프로세스간 통신방법) 이다.

  SendMessage() / PostMessage() : 사용자 정의 메시지, 시스템 등록 메시지
  WM_COPYDATA, Atom 등을 이용하는 방법
  DLL (Dynamic Link Library) 공유
  동적 자료 교환 (Dynamic Data Exchange : DDE)
  OLE 자동화 (Automation)
  메모리 맵 파일 (Memory Map File)
  NetBIOS
  네임드 파이프 (Named Pipe)
  메일 슬롯 (Mail Slot)

 위에 나열된 IPC에는 동일 시스템(로컬 시스템)에서만 사용되는 것이 있고, 다른 시스템(리모트 시스템)에서도 작동되는 것이 있다.

 다음의 예제는 wParam과 lParam 두 변수를 이용해서 데이터 전송이 가능하다. 이 두 변수의 크기는 다음과 같다.

 

만약 데이터가 4바이트가 넘을 경우, 같은 프로세스 내에서는 구조체에 정보를 담거나 메모리를 할당해서 정보를 저장한 후 이것의 포인터를 lParam을 통해 전달하면 된다. 하지만 다른 프로세스 간에는 이런식은 불가능하고 메모리 맵을 사용해야 한다.

 

1. SendMessage() / PostMessage() 사용

 a) RegisterWindowMessage()를 사용할 경우

 RegisterWindowMessage() 함수는 시스템에 유일한 새 윈도우 메시지를 정의하고 등록한다. 리턴되는 메시지 값은 SendMessage() 나 PostMessage() 같은 함수를 호출할 때 사용할 수 있다.

 이 함수의 원형은 위와 같다. 이 함수의 인자로는 메시지를 주고받을 프로그램끼리 미리 약속한 문자열을 넘겨준다. 같은 문자열을 이용하여 메시지를 등록한 프로그램끼리만 서로 메시지를 주고받을 수 있게 되는데, 이 함수의 반환값을 다른 프로그램에 전달할 메시지로 이용하면 된다.

 

 

 b) FindWindow()를 사용할 경우

  FindWindow()의 함수 원형은 다음과 같다.

 FindWindow() 함수는 인자로 클래스 이름윈도우 캡션을 주고, 그에 해당하는 윈도우를 찾는다. 모든 top-level의 윈도우를 찾지만, 차일드 윈도우는 찾지 못한다. 해당하는 윈도우가 없으면 NULL값이 리턴된다. 만약 lpszClassName이 NULL이면 윈도우 캡션에 해당하는 윈도우만 찾고, lpszWindowName이 NULL이면 주어진 클래스 이름에 해당하는 윈도우를 찾는다.

 

 

 

- The end of this article -