2008-10-14 5 views
5

Windows Mobile의 C++ 프로젝트 (예 : .NET이 없음)에서 독립적으로 실행되는 두 개의 응용 프로그램간에 쉽게 통신 할 수있는 방법을 찾고 있습니다. 응용 프로그램 A는 서비스를 실행하지만 응용 프로그램 B는 사용자에게 A의 기능 중 일부를 호출해야하는 기능을 제공합니다. 차라리 COM에서 아무것도 구현하지 않을 것입니다.Windows Mobile에서의 쉬운 IPC?

사실, 직렬화 또는 이와 유사한 (예 : 소켓/파이프/파일을 사용하지 않음) 모든 종류의 작업을 수행하지 않고 A가 모든 매개 변수와 포인터를 A로 전달하도록하는 것이 좋습니다. 또한 C, D 및 E 앱은 실행중인 A 인스턴스 하나만으로 동일한 작업을 수행 할 수 있어야합니다.

B는 때로는 크기가 이전에 알려지지 않은 A에 배열 (또는 std :: vector 또는 std :: map)을 반환해야한다고 추가해야합니다.

Windows Mobile 및 다른 플랫폼에서도 가능합니까?

답변

14

프로세스간에 데이터를 공유 할 수 없습니다. 나는 COM을 추천하지 않는다. Windows CE에는 파이프가 없습니다. 가장 좋은 경로는 memory mapped file (예 : 데스크톱) 또는 point to point message queue (데스크톱과 비슷한 것 없음)입니다. 어떤 것이 더 나은지는 사용 시나리오에 따라 다릅니다.

아니요 안전하지 않은 안전하지 않은 해킹이며 CE 6.0 이상에서는 지원되지 않으므로 VirtualAlloc과 함께 크로스 프로세스 메모리를 사용하려고하면 WinMo 7 이상에서 깨질 수 있습니다.

Windows 메시지와 WM_COPYDATA는 사용하지 않는 것이 좋습니다. 느리고 kludgy이며 오류가 발생하기 쉽습니다.

사람들은 평판 포인트를 얻기 위해 플랫폼을 사용하지 않았을 때 질문에 대답하지 마십시오. 플랫폼을 모르는 경우 다른 사람에게 야생 거위 추격전을 보내는 대신 그 사람을 도우십시오.

+0

감사합니다. 좀 더 자세히 읽고 나면 로컬 소켓을 사용해야 할 것입니다 (이 방법은 모든 모바일 플랫폼에서 잘 작동해야합니다). – Steven

+0

메시지 큐 방법을 pinvoking하면 .Net CF에도 적합할까요? ? 우리는 단지 Sqlite 라이브러리로 노크하는 멍청한 오래된 Sql 테이블을 생각하고있었습니다.지점 간 대기열의 경우 – RoboJ1M

+0

입니다. 예, P/Invoke가 유일한 옵션입니다. 그들은 이미 여기에서 끝났습니다 : http://msdn.microsoft.com/en-us/library/aa446556.aspx – ctacke

-1

사용할 수있는 기반을 거의 모두 살펴 봤습니다. COM, 파이프, 소켓, 메모리 맵 파일. Windows의 모든 프로세스는 완전히 별도의 메모리 공간을 가지고 있으므로 이러한 IPC 메커니즘 중 하나를 사용하지 않고는 아무 것도 공유 할 수 없습니다.

-3

Windows Mobile에서는 모든 프로세스가 동일한 주소 공간에 매핑된다는 것을 기억합니다. 따라서 알려진 이름과 클래스 이름을 가진 두 프로세스에서 메시지 창을 만들고 각 프로세스에서 FindWindow를 사용하여 다른 프로세스를 찾으십시오.

그런 다음 WM_APP가 정의 된 메시지 ID와 wParam 또는 lParam에서 전송할 데이터에 대한 포인터가있는 SendMessage.

내가 틀렸고 모바일이 프로세스 메모리를 파티션하는 경우 데스크톱에서 메모리 매핑을 사용하므로 정말 빠른 - 응용 프로그램간에 데이터를 전송하는 WM_COPYDATA 만 사용하십시오.

0

서비스 (A)와 통신하려면 응용 프로그램 (B) 만 필요하므로 정의 된 IOCTL 집합과 함께 CreateFileDeviceIoControl을 사용하면 어떨까요?