Главная страница
    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.008 c
1-27959
Ushakov Denis
2002-11-28 21:28
2002.12.09
Моитор высокого разрешения и Делфи... проблема


7-28321
Anar
2002-10-07 00:51
2002.12.09
Как перезагрузить комп в Windows XP?


4-28370
Serd_hhc
2002-10-25 17:53
2002.12.09
Как заставить чужое приложение по таймеру...


3-27805
DiamondA
2002-11-22 07:39
2002.12.09
InterBase and TerminalService??????????


3-27881
GLUKAS
2002-11-21 14:13
2002.12.09
Можно ли отследить выполнение запроса???





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