Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как запустить процесс из службы?

36K
09 апреля 2009 года
lesovick
22 / / 09.04.2009
Написана простейшая служба. Как правильно запускать процесс из неё?

Пвтаюсь из службы запустить Notepad, но окно Notepad не открывается :(
11
09 апреля 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: lesovick

Пвтаюсь из службы запустить Notepad


Как???
ЗЫ: сам процесс то запущен?

5
09 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: lesovick
окно Notepad не открывается :(

Правильно. Откуда система знает, в какой сессии пользователя открывать его: вдруг у нас человек десять залогинуто, где показывать тогда?

36K
09 апреля 2009 года
lesovick
22 / / 09.04.2009
Написал службу в C#. Забил код в метод остановки работы службы OnStop:

protected override void OnStop()
{
Process notepad = new Process();
ProcessStartInfo psi = new ProcessStartInfo("D:\\notepad.exe");
psi.WindowStyle = ProcessWindowStyle.Normal;
notepad.StartInfo = psi;
notepad.Start();
}

Установил службу (под пользователем SYSTEM, но, по-моему, это не важно. Пробовал и от имени своего текущего пользователя - один хрен). Запустил. Остановил. Сам процесс в менеджере появляется, а окно Notepad не отображается.
5
09 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: lesovick
Написал службу в C#.

Без PInvoke корректно запустить гуишный процесс из службы не получится. ProcessStartInfo не имеет нужных параметров. Потому, для запуска процесса нужно использовать Win API CreateProcess задав параметр lpDesktop в структуре STARTUPINFO (по ссылке она идет параметром si, но объявление на C# не показано).

Хотя, еще остается WMI, но там будет аналогично (найти десктоп юзера и указать его при запуске).

11
09 апреля 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: hardcase
Без PInvoke корректно запустить гуишный процесс из службы не получится. ProcessStartInfo не имеет нужных параметров. Потому, для запуска процесса нужно использовать Win API CreateProcess задав параметр lpDesktop в структуре STARTUPINFO (по ссылке она идет параметром si, но объявление на C# не показано).

Хотя, еще остается WMI, но там будет аналогично (найти десктоп юзера и указать его при запуске).


Тогда уж ShellExecute попроще будет

36K
09 апреля 2009 года
lesovick
22 / / 09.04.2009
Цитата: oxotnik333
Тогда уж ShellExecute попроще будет



Вы имеете ввиду StartInfo.UseShellExecute? Оттуда можно достать пресловутый lpDesktop? Как?

11
09 апреля 2009 года
oxotnik333
2.9K / / 03.08.2007
имел ввиду WinAPI ShellExecute(...)
36K
09 апреля 2009 года
lesovick
22 / / 09.04.2009
Пытаюсь использовать CreateProcess. В свой код вставил:

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool CreateProcess( string imageName,
string cmdLine,
IntPtr lpProcessAttributes,
IntPtr lpThreadAttributes,
bool boolInheritHandles,
Int32 dwCreationFlags,
IntPtr lpEnvironment,
IntPtr lpszCurrentDir,
byte [] si,
ProcessInfo pi );

Компилятор мне говорит, что тип "System.Diagnostics.ProcessInfo недоступен из-за его уровня защиты" Чего это он?
36K
10 апреля 2009 года
lesovick
22 / / 09.04.2009
Цитата: oxotnik333
имел ввиду WinAPI ShellExecute(...)



Насколько я понял, ShellExecute не позволяет разрешить взаимодействие с рабочим столом, если запускать приложение из службы. Следовательно основная проблема остаётся - "блокнот" запускается, но его не видно.

36K
11 апреля 2009 года
lesovick
22 / / 09.04.2009
Ну хорошо. Разобрался я, вроде с CreateProcess. Процесс nodepad, вроде, запускается. Только при запуске из службы блокнотовского окна всё равно не видно. Я, наверно, lpDesktop неправильно задаю (пытался передать null, "" - не помогает). А как надо? Служба работает от SYSTEM.
38K
13 апреля 2009 года
alt@zir
29 / / 28.08.2008
Попробуй вот так:

 
Код:
STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    si.lpDesktop = L"Default";
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));

    // SetProcessWindowStation(OpenWindowStation(L"WinSta0", FALSE, GENERIC_ALL));
    wchar_t st_proc[] = L"notepad.exe";
    CreateProcess(NULL, st_proc, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);


Если не получится, то раскоменть строчку // SetProcessWindowStation...
но особой уверенности что будет работать у меня нет... не тестил...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог