Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.009 c
1-28032
Andrew2
2002-11-30 03:17
2002.12.09
DLL callback


8-28139
aver
2002-08-23 10:38
2002.12.09
просмотр TIF в DELPHI


7-28309
denick
2002-10-03 11:32
2002.12.09
Как прогу поместить только в system tray ? И как вызвать?


14-28283
ELKa
2002-11-19 14:34
2002.12.09
Ну что же никто так и не поможет что ли?


14-28252
Dbrf
2002-11-18 13:46
2002.12.09
Документация по RXLibrary





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский