Как использовать именованный мьютекс и разделяемую память между службой Windows и процессом? - PullRequest
1 голос
/ 19 сентября 2010

У меня есть код, написанный на C ++ \ MFC, который запускается как служба Windows, и (обычный) процесс C ++ \ MFC Windows - теперь я хочу обмениваться данными между ними, используя именованные Mutex и Shared memory (сопоставление файлов) .

Как это возможно?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2010

Это зависит от ваших требований к коммуникации. Обычно служба создает мьютекс и разделяемую память, а клиенты открывают их и делают вещи. OutputDebugString () - классический пример IPC, использующего мьютекс и разделяемую память (и некоторые события). Вот подробное рассмотрение того, как работает OutputDebugString (); Вы могли бы сделать что-то подобное.

1 голос
/ 20 сентября 2010

Я предлагаю следующий сервис

  1. , создающий мьютекс, 2 события и файл отображения памяти (mmf), все с именем

  2. , когдаслужба должна отправить данные другому процессу

    a.вступает во владение мьютексом

    b.записывает данные в mmf

    c.сигнализирует о событии # 1, которое означает, что у службы есть новая информация для программы

    d.освобождает мьютекс

  3. , когда программа хочет отправить данные в службу

    a.вступает во владение мьютексом

    б.записывает данные в mmf

    c.сигнализирует о событии № 2, которое означает, что в программе появилась новая информация для услуги

    d.освобождает мьютекс

  4. , служба проверяет, включено ли событие # 2.Если не продолжает делать свое дело, иначе это:

    a.вступает во владение ММФ

    б.читает данные

    c.сбрасывает событие # 2

    d.освобождает мьютекс

  5. , программа проверяет, включено ли событие # 1.Если не продолжает делать свое дело, иначе это:

    a.вступает во владение ММФ

    б.читает данные

    c.сбрасывает событие # 1

    d.освобождает mutext

Проблема этого подхода заключается в том, что сообщения могут быть потеряны (например, когда службе удается записать 2 сообщения подряд, прежде чем программа сможет прочитать первое) И только1 процесс может присоединиться к сервису (вы должны убедиться в этом)

Я предлагаю решение на основе сокетов, если это возможно, где встречаются соседние проблемы.

PS выможно использовать mmf для создания какой-то очереди, чтобы избежать первой проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...