2008-10-14 3 views
5

В проекте C++ (т. Е. Нет .NET) на Windows Mobile я ищу способ легко обмениваться данными между двумя независимо работающими приложениями. Приложение A будет запускать службу, тогда как приложение B предоставит пользователю некоторую функциональность, для которой B должен вызвать некоторые из функций A. Я бы предпочел не реализовывать что-либо в COM.Easy IPC на Windows Mobile?

На самом деле, я бы предпочел не выполнять сериализацию или подобное (т. Е. Это исключало бы использование сокетов/труб/файлов), но, скорее всего, B передало все параметры и указатели на A, как если бы A были часть B. Кроме того, приложения C, D и E должны иметь возможность делать то же самое только с одним экземпляром A.

Я должен добавить, что B иногда должен возвращать массив (или std :: vector или std :: map) в A, где размер ранее не известен.

Возможно ли это на Windows Mobile и, возможно, на других платформах?

ответ

14

Вы не можете просто обмениваться данными между процессами. Я не рекомендую COM. Трубы не существуют в Windows CE. Ваш лучший маршрут - это memory mapped file (например, на рабочем столе) или point to point message queue (ничего похожего на рабочий стол). Это лучше зависит от вашего сценария использования.

ли не пытаются использовать перекрестную памяти процесса с VirtualAlloc как предложено, так как это небезопасный хак небезопасным и не поддерживается на CE 6.0 или более поздней версии, так что вы будете в конечном итоге разрыв под WinMo 7 и более поздних версий.

Я не рекомендую использовать сообщения Windows и WM_COPYDATA. Он медленный, клочковый и очень подвержен ошибкам.

Люди, пожалуйста, не просто отвечайте на вопросы, когда вы не использовали платформу, чтобы попытаться получить очки репутации. Если вы не знаете платформу, пусть кто-то другой поможет парню, а не отправит его на дикую охоту за гусями.

+0

Спасибо, после прочтения на нем еще нескольких, я думаю, что мне просто нужно будет использовать локальный сокет (это, надо надеяться, будет работать на всех мобильных платформах). – Steven

+0

Будет ли pinvoking методы очереди сообщений лучше всего использовать для .Net CF ? Мы просто думали о том, чтобы сделать тупую старую таблицу Sql, стучащую с библиотеками Sqlite. – RoboJ1M

+0

для двухточечных очередей, да, P/Invoke - единственный вариант. Они уже сделаны здесь: http://msdn.microsoft.com/en-us/library/aa446556.aspx – ctacke

-1

Вы покрыли почти все доступные базы; COM, каналы, сокеты, файлы с отображением памяти. Все процессы в Windows имеют полностью раздельные пространства памяти, поэтому вы не можете делиться чем-либо без использования одного из этих механизмов IPC.

-3

В Windows Mobile я, похоже, помню, что все процессы отображаются в одно и то же адресное пространство. Итак, создайте окна сообщений в обоих процессах с известными именами и именами классов и используйте FindWindow в каждом процессе, чтобы найти другое.

Затем SendMessage с идентификатором сообщения WM_APP и указателем на данные для передачи в wParam или lParam.

Если я ошибаюсь, и Mobile делает разделение памяти процесса, то просто используйте WM_COPYDATA, который - на рабочем столе использует сопоставление памяти, и поэтому очень быстро - отправлять данные между приложениями.

0

Поскольку вам требуется только приложение (B) для связи с услугой (A), почему бы вам просто не использовать CreateFile и DeviceIoControl с определенным набором IOCTL?

Смежные вопросы