![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Service & Desktop [D5, D6, Win2k, WinXP]
gluka © (2002-10-05 01:32:00)Привет!!!
Для того чтобы созданый ServiceApplication и всё созданое им могло взаемодействовать(было видно) на Desktope необходимо при создании Сервиса установить атрибут Intereactive:=true;
и тогда всё нормально работает (видно формы и месаги).
Вопрос:
Создал я сервис, установил атрибут Intereactive:=true;
но входе роботы сервиса я создаю еще один Десктоп(2) и переключаюсь на него, после чего пытаюсь вывести месагу (ShowMessage) или создать процес (у которого есть форма), но так как мой сервис "интерактивен с старым десктопом(1)" то на новом десктопе(2) я ничего "невижу"!!!!!!!
Как заставить мой сервис быть "интерактивным с новым
десктопу(2)"!??!?!?!?!
Fiend (2002-10-09 12:06:00) [1]Вообще я так думаю, что выдавать сообщения из сервиса - дурной тон.
Для этого есть системные журналы.
Мне кажется, что если уж выдавать сообщение, то о какой то смертельно важной информации. Т.е. например, сервис в полном обсосе, и дальнейшее функционирование системы просто немыслимо без энтой замечкактельной службы!
ZZ (2002-10-09 09:57:00) [2]gluka
Создание процесса
ZeroMemory(@si,SizeOf(si));
Si.cb:=SizeOf(si);
si.lpDesktop:=PChar("Winsta0\NewDesktop");
CreateProcess(nil,"notepad.exe",nil,nil,false,0,nil,nil,si,pi);
Сообщение
SetThreadDesktop(hDesktop);
MessageBox(0,"SERVICE MESSAGE","TEST",MB_OK);
SetThreadDesktop(hOldDesktop);
или
MessageBox(0,"Hello","Service", MB_SERVICE_NOTIFICATION);
ZZ (2002-10-09 01:21:00) [3]а может и не должно :)) (он же интерактивный)
Домой прийду, посмотрю (если никто раньше не поможет)..
ZZ (2002-10-09 01:13:00) [4]si.lpDesktop=PChar("NewDesktop");
по моему должно быть "Winsta0\\NewDesktop" (для С++)
Пошляк (2002-10-08 22:27:00) [5]Ситауция скорее не СОС, а ОТСОС ;-)
gluka (2002-10-08 01:08:00) [6]
SOS
gluka (2002-10-07 17:06:00) [7]Что! Никто невсилах мне помочь???
А конечно извеняюсь что код на сях, если важно то переведу!!!
Зарание благодарен!!!
gluka (2002-10-07 01:53:00) [8]А вот этот код нарыл в СДК!!! Он позволяет видеть МЕССАГУ!!!
//------------------------
DWORD dwGuiThreadId = 0;
int
UserMessageBox(
RPC_BINDING_HANDLE h,
LPSTR lpszWindowStation,
LPSTR lpszDesktop,
LPSTR lpszText,
LPSTR lpszTitle,
UINT fuStyle)
{
DWORD dwThreadId;
HWINSTA hwinstaSave;
HDESK hdeskSave;
HWINSTA hwinstaUser;
HDESK hdeskUser;
int result;
// Ensure connection to service window station and desktop, and
// save their handles.
GetDesktopWindow();
hwinstaSave = GetProcessWindowStation();
dwThreadId = GetCurrentThreadId();
hdeskSave = GetThreadDesktop(dwThreadId);
// Impersonate the client and connect to the User"s
// window station and desktop.
RpcImpersonateClient(h);
hwinstaUser = OpenWindowStation(lpszWindowStation, FALSE, MAXIMUM_ALLOWED);
if (hwinstaUser == NULL)
{
RpcRevertToSelf();
return 0;
}
SetProcessWindowStation(hwinstaUser);
hdeskUser = OpenDesktop(lpszDesktop, 0, FALSE, MAXIMUM_ALLOWED);
RpcRevertToSelf();
if (hdeskUser == NULL)
{
SetProcessWindowStation(hwinstaSave);
CloseWindowStation(hwinstaUser);
return 0;
}
SetThreadDesktop(hdeskUser);
// Display message box.
dwGuiThreadId = dwThreadId;
result = MessageBox(NULL, lpszText, lpszTitle, fuStyle);
dwGuiThreadId = 0;
// Restore window station and desktop.
SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hwinstaSave);
CloseDesktop(hdeskUser);
CloseWindowStation(hwinstaUser);
return result;
}
//-------------------------------
Но замена MessageBox на CreateProcess непомогает!!!!
Может чегото нехватает!?!?!?!
gluka (2002-10-07 01:48:00) [9]
ServiceExecute(TService *Sender)
{
Timer1->Enabled=true;
hDesktop=CreateDesktop("NewDesktop",NULL,NULL,DF_ALLOWOTHERACCOUNTHOOK,
DESKTOP_CREATEMENU
+DESKTOP_CREATEWINDOW+DESKTOP_ENUMERATE+DESKTOP_HOOKCONTROL+
DESKTOP_READOBJECTS+
DESKTOP_SWITCHDESKTOP+DESKTOP_WRITEOBJECTS,NULL);
if (SwitchDesktop(hDesktop)){
hOldDesktop=OpenDesktop(NULL,DF_ALLOWOTHERACCOUNTHOOK,false,
DESKTOP_CREATEMENU+DESKTOP_CREATEWINDOW+DESKTOP_ENUMERATE+
DESKTOP_HOOKCONTROL+DESKTOP_JOURNALPLAYBACK+DESKTOP_JOURNALRECORD+
DESKTOP_READOBJECTS+DESKTOP_SWITCHDESKTOP+DESKTOP_WRITEOBJECTS);
if (hOldDesktop!=0) SetThreadDesktop(hDesktop);
GetStartupInfo(&si);
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOWMAXIMIZED;
si.lpDesktop=PChar("NewDesktop");
CreateProcess("c:\apppr.exe",NULL,NULL,NULL,false,0,NULL,NULL,&si,&pi);
}
while (Terminated==false) ServiceThread->ProcessRequests(true);
}
//-------------------------------------
Timer1Timer(TObject *Sender){
SetThreadDesktop(hOldDesktop);
SwitchDesktop(hOldDesktop);
TerminateProcess(pi.hProcess,2);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseDesktop(hDesktop);
CloseHandle(hOldDesktop);
}
Пример!!!
ZZ (2002-10-06 05:51:00) [10]И еще - как создавал десктоп и под кем запущен сервис?
ZZ (2002-10-06 04:07:00) [11]Ну не форма, а окно.. Хоть бы маленький примерчик дал, как запускал (а процесс ТОЧНО запустился?)
gluka (2002-10-05 18:27:00) [12]
создать процес
В STARTUPINFO процесса (в CreateProcess) есть lpDesktop. Сделай его ="Winsta0\NewDesktopName";
Пробывал с самого начала но форму на новом десктопе невидно!!!
Если всё это сделать не из сервиса то всё работает(видно)
а из сервиса нехочит...
????????
ZZ (2002-10-05 05:59:00) [13]Как заставить мой сервис быть "интерактивным с новым
десктопу(2)"
Никак!!! Но судя по условиям этого и не надо (зы. Просто окна нельзя перемещать с одного десктопа на другой)
вывести месагу (ShowMessage)
У MessageBox(Ex) есть куча параметров, в т.ч. вывод на активный десктоп.
создать процес
В STARTUPINFO процесса (в CreateProcess) есть lpDesktop. Сделай его ="Winsta0\NewDesktopName";