PostThreadMessage для другого процесса - PullRequest
3 голосов
/ 21 июня 2010

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

Как мне получить дескриптор для потока моей службы?

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

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

1 Ответ

3 голосов
/ 21 июня 2010

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

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

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

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