|
A프로그램과 B프로그램은 서로 다른 프로그램이지요?
이렇게 서로다른 프로그램간에 통신을 IPC라고 합니다.
(Inter process Communication)
IPC에는 여러가지 방법이 있습니다.
그중에 가장 흔히 쓰이는 것들중에는
1. socket
2. pipe
3. mappingfile
4. message
...
등이 있습니다.
1) socket은 뭐 잘 아실테구
2) pipe는
그냥 pipe와 namedpipe가 있는데
그냥 pipe는 프로세서가 서로 종속적인 관계일때 주로 쓰입니다.
예를들어
커맨트 창(cmd.exe) 에서 ipconfig 명령을 입력했다고 합시다
그러면 cmd.exe는 pipe를 만들어서 ipconfig.exe 를 실행하면서 표준 입력력으로 pipe를 넘깁니다.
그러면 ipconfig.exe에서는 그냥 표준출력 print , cout 등으로 출력하기만 하면
cmd.exe에서 받을수 있죠
또 namedpipe는 이름이 있는 pipe로 서버 / 클라이언트로 구분할수있는데요
프로세서가 종속적이지 않아도 되구
꼭 같은 pc가 아니라도 됩니다.
얼마전에 구글에서 출시한 웹브라우져인 크롬이 멀티프로세서로 만들어졌는데
프로세서간 통신을 namedpipe로 구현했다고 하더군요
3. mappingfile은
싶게 표현하면
A프로세서에서 file에 기록해두고
B프로세서에서 그 기록된 file에서 읽어오는것입니다.
HOOK같은것 할때 많이 쓰이곤 하더군요
4. message
윈도우 환경에서는 간단한 것은 가장 흔하게 쓰이는 방식이죠
FindWindow로 윈도우 핸들을 찾아서
SendMessage로 message , wparam , lparam 을 보냅니다.
수신하는 측에서 message를 보고 wparam , lparam을 받아서 처리하죠
그런데 wparam , lparam은 각각 long형으로 각 4byte 총 8Byte 밖에 되지 않습니다.
그래서 전달할수 있는 정보에는 한계가 있죠. 8byte로 충분하면 그냥 이렇게 써도 되구요
데이타가 많으면 주로 WM_COPYDATA 메세지를 이용해서 보냅니다.
WM_COPYDATA 로 검색하면 엄청 많이 나올것입니다.
메세지 WM_USER 이하의 메세지는 wparam , lparam을 포인터로 볼때 그 포이터가 가리키는
값을 다른 프로세서에서 접근할수 있도록 시스템(Windows)에서 다른 부분에 복사해서 보내줍니다.
실제로는 메모리 공간이 다르기때문에 그냥 access하면 에러가 나죠
기타...
클립보드를 이용하는 방법도 괜찮구요
걍 파일에 기록하거나 db에 기록해놓고 메세지로 동기화해서 읽어오게 해도 되구요.
무식한(?) 방법으로 해당 프로세서의 메모리공간으로 접근할수도 있습니다.
방법은 매우 많은데 만들고자 하는 프로그램에 맞게 적절한 방법을 선택해서 사용해야 겠지요
그럼..
깐돌 님이 쓰신 글 :
: A라는 프로그램의 메뉴버튼을 클릭하면 B프로그램이 실행되도록 shellexecuteEx 로 연결하였습니다.
:
: B프로그램에서 LinkedList로 된 어떤 정보를 보내서 A에서 그 정보를 활용해야되는데..
:
: 전혀 감이 안잡힙니다.
:
: 참고로 프로그램은 WindowAPI 로 구현된 것입니다.
:
: A, B프로그램에 어떤 함수 또는 방법으로 처리해야되는지 조언좀 부탁드립니다.
|