Вопрос

В проекте 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 и, возможно, на других платформах?

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top