сервис
От: sergei_132 http://sergbox.blogspot.com
Дата: 12.03.06 10:29
Оценка:
Можно ли из функции ServiceMain создавать и записывать файл?



VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR * ppszArgv)
{    

    _Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    _Status.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE|SERVICE_ACCEPT_PARAMCHANGE|SERVICE_ACCEPT_NETBINDCHANGE;
    _Status.dwWin32ExitCode = 0;
      _Status.dwServiceSpecificExitCode = 0;
    _Status.dwCheckPoint = 0;
    _Status.dwWaitHint = 0;

    _hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (_hEvent == NULL)
    {
        _RPT_API_FAILED(CreateEvent);
        return;
    }

    _hStatus = RegisterServiceCtrlHandler(_pszServiceName, CtrlHandler);
    if (_hStatus == NULL)
    {
        _RPT_API_FAILED(RegisterServiceCtrlHandler);
        _VERIFY(CloseHandle(_hEvent));
        return;
    }

    _Status.dwCurrentState = SERVICE_RUNNING;
    _VERIFY(SetServiceStatus(_hStatus, &_Status));


fstream txt("out.txt", ios_base::out | ios_base::trunc); ///  <--- вот здесь , почему то не создается файл
txt.write("123",3);


    WaitForSingleObject(_hEvent, INFINITE);
    _VERIFY(CloseHandle(_hEvent));

    _Status.dwCurrentState = SERVICE_STOPPED;

}


заранее спасибо.
Re: сервис
От: Anton Batenev Россия https://github.com/abbat
Дата: 12.03.06 13:17
Оценка: 1 (1)
Здравствуйте, sergei_132, Вы писали:

_>Можно ли из функции ServiceMain создавать и записывать файл?


[skip]

_>fstream txt("out.txt", ios_base::out | ios_base::trunc); /// <--- вот здесь , почему то не создается файл

_>txt.write("123",3);

У сервисов есть одна особенность. После старта они используют как текущий путь %WINDIR%\SYSTEM32. Проверьте, не создется ли файл по этому пути?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: сервис
От: Сергей Мухин Россия  
Дата: 12.03.06 13:38
Оценка:
Здравствуйте, 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. Проверьте, не создется ли файл по этому пути?


я бы еще и права проверил
---
С уважением,
Сергей Мухин
Re[2]: сервис
От: sergei_132 http://sergbox.blogspot.com
Дата: 13.03.06 08:15
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>У сервисов есть одна особенность. После старта они используют как текущий путь %WINDIR%\SYSTEM32. Проверьте, не создется ли файл по этому пути?


действительно, там и создается файл.
Но только вот еще вопрос: почему он не сразу создается, а только когда я останавливаю сервис?
Re[3]: сервис
От: sergei_132 http://sergbox.blogspot.com
Дата: 13.03.06 08:26
Оценка:
нет, не совсем так. Создается файл сразу, а вот запись в него происходит только после остановки сервиса.

и еще: почему если в функции ServiceMain выводить сообщение MessageBox(NULL,L"текст",L"OK",0);
то оно не выводится! почему?
Re[3]: сервис
От: Аноним  
Дата: 13.03.06 08:35
Оценка: +1
Здравствуйте, sergei_132, Вы писали:

_>Но только вот еще вопрос: почему он не сразу создается, а только когда я останавливаю сервис?


flush / close ?
Re[4]: сервис
От: CTpaHHoe Россия http://ctpahhoe.blogspot.com/
Дата: 13.03.06 08:53
Оценка:
On Mon, 13 Mar 2006 11:26:11 +0300, sergei_132 <52256@users.rsdn.ru> wrote:


> и еще: почему если в функции ServiceMain выводить сообщение

> MessageBox(NULL,L"текст",L"OK",0);
> то оно не выводится! почему?

Ваш сервис не интерактивный, посему он не взаимодействует с рабочим
столом. Более подробно можете прочитать в статье на сайте
http://rsdn.ru/article/baseserv/svcadmin-1.xml
Автор(ы): Александр Федотов
Дата: 24.03.2002
В статье рассматриваются вопросы управления системными
службами Windows NT: чтение и изменение конфигурации, запуск и
остановка, установка и удаление служб. В статье описана большинство
функций управления службами, использование каждой функции
продемонстрировано примерами.


И вообще, это нехорошая практика — выводить какие-либо окошки из сервисов.
Что будет с вашим рабочим столом при работе такого сервиса на протяжении
полугода? Пишите события в Event Log или в свой журнал.

--
на этом прощаюсь, CTpaHHoe
mailto-besso-at-hotbox-dot-ru
Posted via RSDN NNTP Server 2.1 beta
сразу к делу, без приветов. осторожно, злой антиспам
Re[4]: сервис
От: Alexey Frolov Беларусь  
Дата: 13.03.06 08:55
Оценка: +1
Здравствуйте, sergei_132, Вы писали:

_>нет, не совсем так. Создается файл сразу, а вот запись в него происходит только после остановки сервиса.


_>и еще: почему если в функции ServiceMain выводить сообщение MessageBox(NULL,L"текст",L"OK",0);

_> то оно не выводится! почему?

Нужно выводить MessageBox с флагом MB_SERVICE_NOTIFICATION
Что, почему и как прочитайте здесь
Re[5]: сервис
От: Alexey Frolov Беларусь  
Дата: 13.03.06 08:56
Оценка:
Извиняюсь, не совсем правильно я вас отослал
здесь
Re[4]: сервис
От: ekamaloff Великобритания  
Дата: 13.03.06 08:58
Оценка:
Здравствуйте, sergei_132, Вы писали:

_>и еще: почему если в функции ServiceMain выводить сообщение MessageBox(NULL,L"текст",L"OK",0);

_> то оно не выводится! почему?

Кури MSDN на предмет SetProcessWindowStation, SetThreadDesktop. Вот еще статейка из локального MSDN-а на эту тему (в онлайне не нашел ):

Interacting with the User in a Service

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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.