Провел ряд успешных и не очень экспериментов. Пришел к выводу, что всякие
Send/PostMessage, а тем более пайпы, майлслоты - это все или сложно, или запутанно, или не отвечает условиям задачи. Остановился на решении, предложенном уважаемым коллегой
Dimka, т.е.
Memory mapped file.
Напомню, речь идет о связи двух процессов типа тока-точка для передачи команды (двоичного числа). Это условие позволило максимально упростить задачу. Алгоритм сводится к следующему.
1. Головная программа (сервер) создает два межпроцессных объекта: ивент и файл в памяти (
Memory mapped file).
2. Далее все просто, как дверь. Головная программа в случае необходимости передать команду (число) проверяет, не установлен-ли ивент.
3а. Если ивент установлен, то считается, что на том конце никого нет и команда отбрасывается (ее некому передавать).
3б. Если ивент сброшен, то команда (или любые нужные данные, например некая структура) записывается в файл и ивент устанавливается.
На стороне клиента алгоритм еще проще.
4. Открываются оба межпроцессных объекта. Ивент сбрасывается, чтобы не реагировать на старые данные, которые могут быть в файле.
5. Ожидаем сигнала ивента.
6. Когда сигнал поступает, забираем пришедшие данные и сбрасываем ивент, тем самым сигнализируя головной программе, что можно посылать новые данные.
Выглядит все это так. Запускаем сервер и клиент:
Затем нажимаем кнопку "Start" и наслаждаемся результатом:
Если клиента закрыть, то начинают считаться пропущенные пакеты. При повторном старте клиента пакеты начинают передаваться ему как ни в чем не бывало :-)
И все! Простое и элегантное решение! Как говорится: "Мы в восхищении!" (С) Кот Бегемот :-)
P.S. Прилагаю два проекта, иллюстрирующих применение этого механизма: клиент и сервер. Общие параметры описаны в файле "Transfer_defines.h". В нем определяются имена объектов и размер передаваемого блока данных. Функционал передачи/приема соответственно в файлах "Transfer_server.cpp" / "Transfer_client.cpp".
P.P.S. Я работаю на Win XP. Но проверял эти две программки на Win 7 64 бита (причем, в режиме обычного пользователя, не Администратора). Все работает нормально.