Windowsservice и *.exe

Тема в разделе ".NET", создана пользователем f.7, 3 сен 2007.

  1. f.7

    f.7 Гость

    Приветствую всех.
    Вот значит столкнулся с такой траблой, мне необходимо запустить *.exe файл при старте WindowsService и закрыть его при остановке WindowsService. Ну после немногочисленых раздумий, я так подумал что мне надо просто написать 2 *.bat файла и просто их запускать при старте и при остановке
    делаю значть так
    Код (Text):
    protected override void OnStart(string[] args)
    {
    Process batch = new Process();
    [b]batch.StartInfo.FileName = @"C:\bugtracker\imstart.cmd";[/b]         batch.StartInfo.Arguments = "";
    batch.StartInfo.UseShellExecute = true;
    batch.Start();
    batch.WaitForExit();
    }
    выше приведенный пример у меня запускает бат файл(тоже самое и на остановке сервиса)
    А вот саммое интересное, я пишу в бат файле команды на запуск ехе (допустим канкулятора), при старте сервиса он виснет и ничего не происходит, но когда я содержимое файла меняю на то чтобы он допустим создавал папку на диске все прекрастно работает.
    Поясните пожалуйста что это за несправедливость и как с этим бороться?
     
  2. f.7

    f.7 Гость

    Ответов тьма :) ,
    всё вроде сделал, короче надо при создании сервиса прописать ему что он будет запускаться от LocalSystem, потом инсталировать сервис, потом в Control Panel>AdministrativeTols>Service, найти наш сервис, открыть свойства, перейти на вкладочку LogOn, выбираем Local System account, и чуть ниже ставим в квадратик галочку, нажимаем кнопочку Ок и запускаем наш сервис. Далее откидываемся на спинку стула и не скрывая радости любуемся на свё творение... :D
     
  3. Pasha

    Pasha Гость

    Для: f.7
    Это конечно просто мое скромное мнение, но не проще ли было запускать сам exe через тот же Process, а при остановке сервиса проверять HasExited и делать CloseMainWindow и/или Kill?
     
  4. f.7

    f.7 Гость

    Для: Pasha
    Твои мнения для меня всегда авторитетные, но просто надо не одну прогу запускать а несколько, и возможно будут меняться пути и всё такое, мне кажеться лучше запускать батник, прописал в батник всё что хошь, а сервис чисто его запускает, даж не надо ничего перекомпилять :)
     
  5. 62316e

    62316e Гость

    Я не силен в .НЕТ но зачем тебе batch.WaitForExit(); ?
     
  6. f.7

    f.7 Гость

    <!--QuoteBegin-62316e+5:09:2007, 15:30 -->
    <span class="vbquote">(62316e @ 5:09:2007, 15:30 )</span><!--QuoteEBegin-->Я не силен в .НЕТ но зачем тебе batch.WaitForExit(); ?
    [snapback]77301" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    дык я тож не силен ;) , нашел в инете - прописал - работает :rolleyes:
     
  7. 62316e

    62316e Гость

    Мило. Попробуй значит так: убери WaitForExit(); и у тебя сразу должно все заработать, те если бы ты прошелся дебагером то ты бы увидел что он остановится на этой ф-и. Или сделать еще один поток и в нем запускать бат файл. Хотя я бы ни так ни так не делал. Я бы на твоем месте MSDN покусал.

    Так. Сорри, забыл о постановке задачи. При старте сервиса надо делать: process.Start(). при остановке process.Stop(); // если там есть такой конечно? ))
     
  8. Pasha

    Pasha Гость

    Для: 62316e
    WaitForExit гарантирует что exe запустятся до выхода из OnStart. А про process.Start/Stop я уже писал выше, но похоже нужен именно батник.
     
  9. karlito

    karlito Гость

    Надеюсь помогу.
    Во-первых, включи для твоего сервиса опцию "Разрешить взаимодействие с рабочим столом" - по-крайней мере будешь видеть, что происходит, когда окна открываешь. Калькулятор теперь на самом деле открывается, но ты его не видишь, а закрыть ты его тоже не можешь, поэтому всё и виснет
    Запускай калькулятор в отдельном потоке. Короче, кусочек тебе живого похожего кода.
    Код (Text):
    internal static void ShowFeedBackPage()
    {
    Thread thread = new Thread(new ThreadStart(ShowFeedBackPageHandler));
    thread.ApartmentState = ApartmentState.STA;
    thread.Start();
    while(!thread.Join(100))
    {
    Application.DoEvents();            
    }
    }

    internal static void ShowFeedBackPageHandler()
    {
    try
    {
    System.Diagnostics.Process.Start(FEEDBACKPAGE_URL);
    }
    catch(Exception ex)
    {
    Debug.Fail(ex.Message, ex.ToString());
    }
    }
     
Загрузка...

Поделиться этой страницей