2010-06-21 10 views
3

Я хочу опубликовать сообщение в поток, который выполняется как другой процесс (в частности, как служба Windows). Я прочитал документацию для PostThreadMessage, но для меня есть некоторые вещи.PostThreadMessage для другого процесса

Как получить ручку для потока моего сервиса?

Система выполняет только маршрутизацию системных сообщений (в диапазоне от 0 до (WM_USER-1)). Чтобы отправить другие сообщения (те> = WM_USER) в другой процесс, вы должны выполнить пользовательскую сортировку.

Я хочу отправить свои сообщения, так как мне это сделать?

ответ

3

PostThreadMessage здесь не идеален. Получение идентификатора потока действительно является проблемой, так как вашему сервису придется запускать более одного потока. Один для реализации службы, другой - для накачки контура сообщения, необходимого для чтения сообщений. CreateToolHelp32Snapshot() может перечислить потоки, но вы все равно не знаете, какой из этих двух потоков является накачкой.

Используйте вместо этого именованный канал. Вызовите CreateNamedPipe() в своей службе, используйте режим сообщения и дайте каналу имя с префиксом «Global», чтобы оно было видно в сеансе пользователя. Код пользователя может подключаться к трубе с использованием известного имени трубы. Вы можете отправлять все, что хотите, по всему каналу, но вам придется избегать указателей, поскольку они не будут действительны в процессе обслуживания. Такая же проблема, как маршалинг сообщений.

Другие возможности - это сокет, очень похожий на трубу, но с использованием известного номера порта вместо имени и внепроцессного COM. Использование COM является преимуществом, если у вас есть сложные объекты, которые необходимо маршалировать по границе процесса. Избегайте этого, если у вас нет COM-навыков.

+0

Что я пытаюсь сделать, это найти лучший способ для моего сервиса и приложения общаться и сделать это общение наименее видимым для любого третьего лица. Я не хочу идти по COM. Названные трубы выглядят интересными. –

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