Easy IPC на Windows Mobile?

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

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

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

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


person Steven    schedule 14.10.2008    source источник


Ответы (5)


Вы не можете просто обмениваться данными между процессами. Я не рекомендую COM. В Windows CE нет каналов. Ваш лучший маршрут - это файл с отображением памяти (как на рабочем столе) или точка-точка очереди сообщений (ничего подобного на рабочем столе). Что лучше, зависит от вашего сценария использования.

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

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

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

person ctacke    schedule 14.10.2008
comment
Спасибо, прочитав еще немного, я думаю, мне просто придется использовать локальный сокет (надеюсь, это сработает на всех мобильных платформах) - person Steven; 15.10.2008
comment
Будет ли фиксация методов очереди сообщений лучше всего для .Net CF? Мы как раз подумывали о том, чтобы провести тупую старую таблицу Sql с библиотеками Sqlite. - person RoboJ1M; 07.10.2013
comment
для двухточечных очередей да, P / Invoke - единственный вариант. Они уже сделаны здесь: msdn.microsoft.com/en-us/library /aa446556.aspx - person ctacke; 07.10.2013

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

person Johann Gerell    schedule 10.11.2008

Вот хороший источник для начала - http://msdn.microsoft.com/en-us/library/aa446520.aspx Вы сами решаете, какой вариант лучше всего подходит для ваших нужд.

person Community    schedule 17.12.2008

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

person Gerald    schedule 14.10.2008

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

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

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

person Chris Becke    schedule 14.10.2008