메뉴 건너뛰기

일반 프로세스간 데이터 전송

2008.10.01 09:44

허우행 조회 수:11221 추천:137

http://cafe.naver.com/wincepro/2096A와 B가 서로 같은 Process 안에 있는 쓰레드인지

아니면 서로 다른 쓰레드에 있는 것인지에 따라 처리 방법이 약간 다릅니다.

서로 같은 Process 안에 존재한다면 모든 Event및 메모리 핸들은 서로 공유가 됩니다.

그렇다면 이벤트가 발생했을 때 당연히 메모리 핸들을 넘겨 주면 되겠죠.

단, 메모리가 동적으로 생성되는 것이라면 뮤텍스를 두어서 메모리 보호를 해야 되겠지요.



A와 B 쓰레드가 서로 다른 Process에 존재한다면 문제가 달라집니다.

이것은 IPC가 되는데 CE에서는 XP와 달리 몇몇 방법은 사용할 수 없습니다.

CE에서 사용할 수 있는 방법은 대부분 아래와 같은 세 방법이 존재합니다.



1. WM_COPYDATA 메시지를 이용하는 방법

2. Named Memory Map을 이용하는 방법

3. Message Queue를 이용하는 방법



1번 WM_COPYDATA 를 이용하는 방법

가장 단순한 방법으로 이 메시지를 이용하면 매개변수로 포인터를 전달할 수 있으나

이 메시지를 받는 즉시 포인터의 내용을 복사해서 사용해야 합니다. 전달받은 포인터의

메모리가 동적으로 생성된 메모리의 포인터라면 언제 사라질지 모르기 때문에...



2번 Named Memory Map을 이용하는 방법
두 Process가 동시에 동등하게 접근할 수 있는 공유 메모리 블록을 생성할 수 있습니다.

단, 시스템이 메모리 객체에 대한 정확한 사용 카운트를 유지할 수 있어야 합니다.

다른 프로세스가 사용중인 메모리를 나머지 프로세스가 종료하면서 해제하지 않도록 해야 합니다.

CreateFileForMapping, MapViewOfFile 함수를 찾아보세요.



3번 Message Queue를 이용하는 방법

Windows CE에서는 Message Queue라는 것을 제공합니다. 이것은 한 Process에서 다른 Process로 데이터를

전달할 수 있도록 Data Queue를 제공합니다. 데이터를 주고 받기 위해서는 Read Queue와 Write Queue를 각각

생성해야 합니다. CreateMsgQueue, OpenMsgQueue, WriteMsgQueue, ReadMsgQueue,

GetMsgQueueInfo, CloseMsgQueue 함수를 참고하세요.



도움이 되었으면 좋겠군요.