Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];

Вниз

Как послать Service-у сообщение?   Найти похожие ветки 

 
AlexanderSK   (2003-03-05 12:39) [0]

Из своей программы запускаю Service. А затем моя программа должна обмениваться с ним данными. Подскажите пожалуйста как послать Service-у сообщение?


 
Digitman   (2003-03-05 12:52) [1]

отправитель сообщения :
см. RegisterWindowMessage, SendMessage, PostMessage, PostThreadMessage e.t.c.

приемник сообщения :

RegisterWindowClass, CreateWindow, RegisterWindowMessage, GetMessage, WaitMessage, PeekMessage, MsgWaitForMultipleObjects, DispatchMessage e.t.c.


 
AlexanderSK   (2003-03-05 13:07) [2]

Ну а если у службе в настройках запрещено взаимодействие с рабочим столом? тогда что? кому отправлять сообщение?


 
Игорь Шевченко   (2003-03-05 13:07) [3]

С сервисом можно обмениваться любым способом, например через named pipes или memory mapped files. Хороший пример есть в Platform SDK


 
Digitman   (2003-03-05 13:15) [4]


> если у службе в настройках запрещено взаимодействие с рабочим
> столом?


Непонятно, при чем здесь "рабочий стол"

Код.поток сервиса регистрирует именованное сообщение, при необходимости создает окно (верхнеуровневое) и организует цикл ожидания/выборки/диспетчеризации/обработки сообщений, адресованных либо код.потоку либо окну, им созданному

Код.поток отправителя сообщения регистрирует именованное сообщение (либо получает код уже зарегистрированного сервисом именованного сообщения) и оправляет сообщение с заданным кодом либо в окно, организованное код.потоком сервиса, либо собственно код.потоку сервиса. Если сервис организовал вышеупомянутый цикл, то он получит сообщение и отреагирует на него по твоей логике


 
AlexanderSK   (2003-03-05 13:48) [5]

>Игорь Шевченко
Если можно по подробнее! Где взять этот Platform SDK?


 
AlexanderSK   (2003-03-05 13:50) [6]

>Digitman
А откуда взять Handle Код.потока сервиса?


 
Игорь Шевченко   (2003-03-05 13:55) [7]

AlexanderSK © (05.03.03 13:48)

http://www.microsoft.com


 
Digitman   (2003-03-05 14:24) [8]


> AlexanderSK


в принципе можно провести енумерацию код.потоков процесса-сервиса, посылая каждому из них сообщение на предмет реакции на него

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


 
Набережных С.   (2003-03-05 18:22) [9]

Насколько позволяет судить мой скромный опыт:
Нельзя послать сообщение между процессами в разных оконных станциях.
Нельзя из потока на одном столе послать сообщение окну на другом столе той же станции.
Из потока на одном столе можно послать сообщение потоку на другом столе той же станции, даже если этот поток принадлежит процессу из другой оконной станции.


 
Digitman   (2003-03-06 08:33) [10]

Можно поступить и след.образом.

Код.поток процесса-сервиса создает окно (hWnd) и вызовом SetProp(hWnd, "TargetThreadId", GetCurrentThreadId) устанавливает значение некоего предопределенного именованого св-ва "TargetThreadId", равное ThreadId потока (ThreadId самого себя)

Процесс-контроллер, которому требуется послать сообщение код.потоку сервиса, ищет это окно hWnd (любым известным способом, например, по известному имени его класса) и, получив по GetProp(hWnd, "TargetThreadId") целевой ThreadId, получает такую возможность, делая вызов PostThreadMessage(ThreadId,..)


 
AlexanderSK   (2003-03-06 14:04) [11]

>Digitman ©
Да не находит процесс-контроллер это окно ни по заголовку, ни по имени класа! Если конечно в нестройках сервиса не разрешмть взаимодействие с рабочим столом!


 
Игорь Шевченко   (2003-03-06 14:11) [12]

"Interacting with the User in a Service

For a noninteractive service application to interact with the user, it must open the user"s window station ("WinSta0") and desktop ("Default"). By default, only the logged-on user and service applications running in the LocalSystem account are granted access to the user"s window station and desktop. This means that services running in other accounts must either impersonate the user when opening the interactive window station and desktop, or have access granted to those accounts by the user.


For compatibility with versions of Windows that support multiple users and/or multiple desktops per user, the user"s window station and desktop names should not be hard-coded. Client applications should pass the names of their window station and desktop to the service as part of the request to the service."

MSDN, October 2002




 
Digitman   (2003-03-06 14:41) [13]


> Если конечно в нестройках сервиса не разрешмть взаимодействие
> с рабочим столом


Нет, ну а что мешает это сделать-то ? Какие препятствия для включения этой опции ?


 
AlexanderSK   (2003-03-06 16:57) [14]

>Нет, ну а что мешает это сделать-то ? Какие препятствия для включения этой опции

А вот тут-то и начинается самое интересное! Все дело в том, что если это сервайс должен предоставлять COM/DCOM услуги ТО в ряде случаев если такой сервайс имеет окно (впрчем тоже самое происходит и с обычным приложением) то при подключении клиента подключение происходит не к запущенному (мной) сервайсу/приложению, а ЗАПУСКАЕТСЯ ЕГО ВТОРАЯ КОПИЯ, причем не имеющая доступа к десктопу! И вот с ней-то и работает клиент!

Вот такое вот веселье!


 
Digitman   (2003-03-06 17:14) [15]


> ЗАПУСКАЕТСЯ ЕГО ВТОРАЯ КОПИЯ


Так ведь это никак не связано с темой твоего изначального вопроса !

поскольку приложение-сервис у тебя является еще и фабрикой COM-объектов (вероятно, exe-файл сервиса как положено зарегистрирован в реестре в числе прочих COM-серверов), то нет ничего удивительного, что при некорректной настройке DCOM-сервера и при неверно выбранной instancing-модели в коде создания самой фабрики твоего COM-класса именно такая ситуация и возникает ! Иля я чего-то недопонимаю в твоих объяснениях этой ситуации ..



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
1-12697
Zergling
2003-04-23 06:26
2003.05.05
Копия динамического массива


14-12931
Ёжик
2003-04-18 11:34
2003.05.05
Учет в Библиотеке


1-12751
$Hic0
2003-04-21 16:22
2003.05.05
TMemo, TRichEdit


6-12854
OxOTHuK
2003-03-08 09:58
2003.05.05
Потоки....


1-12747
Nikos
2003-04-21 19:27
2003.05.05
Проблемы с объявлением процедуры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский