Здравствуйте, sergei_132, Вы писали:
_>нет, не совсем так. Создается файл сразу, а вот запись в него происходит только после остановки сервиса.
_>и еще: почему если в функции ServiceMain выводить сообщение MessageBox(NULL,L"текст",L"OK",0); _> то оно не выводится! почему?
Нужно выводить MessageBox с флагом MB_SERVICE_NOTIFICATION
Что, почему и как прочитайте здесь
Здравствуйте, Anton Batenev, Вы писали:
AB>Здравствуйте, sergei_132, Вы писали:
_>>Можно ли из функции ServiceMain создавать и записывать файл?
AB>[skip]
_>>fstream txt("out.txt", ios_base::out | ios_base::trunc); /// <--- вот здесь , почему то не создается файл _>>txt.write("123",3);
AB>У сервисов есть одна особенность. После старта они используют как текущий путь %WINDIR%\SYSTEM32. Проверьте, не создется ли файл по этому пути?
Здравствуйте, Anton Batenev, Вы писали:
AB>У сервисов есть одна особенность. После старта они используют как текущий путь %WINDIR%\SYSTEM32. Проверьте, не создется ли файл по этому пути?
действительно, там и создается файл.
Но только вот еще вопрос: почему он не сразу создается, а только когда я останавливаю сервис?
И вообще, это нехорошая практика — выводить какие-либо окошки из сервисов.
Что будет с вашим рабочим столом при работе такого сервиса на протяжении
полугода? Пишите события в Event Log или в свой журнал.
--
на этом прощаюсь, CTpaHHoe
mailto-besso-at-hotbox-dot-ru
Здравствуйте, sergei_132, Вы писали:
_>и еще: почему если в функции ServiceMain выводить сообщение MessageBox(NULL,L"текст",L"OK",0); _> то оно не выводится! почему?
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.
This code sample displays a message on the user's desktop in response to an RPC request from one of the user's applications. Note that a global variable dwGuiThreadId in this example is also used in the logoff handling example. If the thread that displays the message box terminates after it is done with the message box, it is not necessary to save and restore the thread's desktop. It is necessary to restore the process's window station.
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;
}
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde