Форум: "Система";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
ВнизService & Desktop Найти похожие ветки
← →
gluka (2002-10-05 01:32) [0]Привет!!!
Для того чтобы созданый ServiceApplication и всё созданое им могло взаемодействовать(было видно) на Desktope необходимо при создании Сервиса установить атрибут Intereactive:=true;
и тогда всё нормально работает (видно формы и месаги).
Вопрос:
Создал я сервис, установил атрибут Intereactive:=true;
но входе роботы сервиса я создаю еще один Десктоп(2) и переключаюсь на него, после чего пытаюсь вывести месагу (ShowMessage) или создать процес (у которого есть форма), но так как мой сервис "интерактивен с старым десктопом(1)" то на новом десктопе(2) я ничего "невижу"!!!!!!!
Как заставить мой сервис быть "интерактивным с новым
десктопу(2)"!??!?!?!?!
← →
ZZ (2002-10-05 05:59) [1]Как заставить мой сервис быть "интерактивным с новым
десктопу(2)"
Никак!!! Но судя по условиям этого и не надо (зы. Просто окна нельзя перемещать с одного десктопа на другой)
вывести месагу (ShowMessage)
У MessageBox(Ex) есть куча параметров, в т.ч. вывод на активный десктоп.
создать процес
В STARTUPINFO процесса (в CreateProcess) есть lpDesktop. Сделай его ="Winsta0\NewDesktopName";
← →
gluka (2002-10-05 18:27) [2]
создать процес
В STARTUPINFO процесса (в CreateProcess) есть lpDesktop. Сделай его ="Winsta0\NewDesktopName";
Пробывал с самого начала но форму на новом десктопе невидно!!!
Если всё это сделать не из сервиса то всё работает(видно)
а из сервиса нехочит...
????????
← →
ZZ (2002-10-06 04:07) [3]Ну не форма, а окно.. Хоть бы маленький примерчик дал, как запускал (а процесс ТОЧНО запустился?)
← →
ZZ (2002-10-06 05:51) [4]И еще - как создавал десктоп и под кем запущен сервис?
← →
gluka (2002-10-07 01:48) [5]
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);
}
Пример!!!
← →
gluka (2002-10-07 01:53) [6]А вот этот код нарыл в СДК!!! Он позволяет видеть МЕССАГУ!!!
//------------------------
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 17:06) [7]Что! Никто невсилах мне помочь???
А конечно извеняюсь что код на сях, если важно то переведу!!!
Зарание благодарен!!!
← →
gluka (2002-10-08 01:08) [8]
SOS
← →
Пошляк (2002-10-08 22:27) [9]Ситауция скорее не СОС, а ОТСОС ;-)
← →
ZZ (2002-10-09 01:13) [10]si.lpDesktop=PChar("NewDesktop");
по моему должно быть "Winsta0\\NewDesktop" (для С++)
← →
ZZ (2002-10-09 01:21) [11]а может и не должно :)) (он же интерактивный)
Домой прийду, посмотрю (если никто раньше не поможет)..
← →
ZZ (2002-10-09 09:57) [12]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);
← →
Fiend (2002-10-09 12:06) [13]Вообще я так думаю, что выдавать сообщения из сервиса - дурной тон.
Для этого есть системные журналы.
Мне кажется, что если уж выдавать сообщение, то о какой то смертельно важной информации. Т.е. например, сервис в полном обсосе, и дальнейшее функционирование системы просто немыслимо без энтой замечкактельной службы!
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c