вызов ShellExecute или CreateProcess в сервисах
От: alexora  
Дата: 13.10.04 08:46
Оценка:
Вот мне в сервисе NT надо вызвать свою софтину. Через что вызывать ? Я пробовал через ShellExecute — Ничего не получилось. С CreateProcess получилось вызвать софтину которая просто в файл записывает что она запустилась. Если добавить MessageBox в ней то вываливается.
Re: вызов ShellExecute или CreateProcess в сервисах
От: Valicchh Казахстан  
Дата: 13.10.04 09:28
Оценка:
Здравствуйте, alexora, Вы писали:

A>Вот мне в сервисе NT надо вызвать свою софтину. Через что вызывать ? Я пробовал через ShellExecute — Ничего не получилось. С CreateProcess получилось вызвать софтину которая просто в файл записывает что она запустилась. Если добавить MessageBox в ней то вываливается.


Дело в том что сервисы запускаются в так называемом DeskTop0, а все пользовательские программы в DeskTop1. Ищите в MSDN -- windowstation, desktop...

То есть теоретически вы должны из сервиса (из его WindowStationXX\DesktopXX) найти Ваш (пользовательный) десктоп, получить его security_deskriptor и создать дочерний процесс в контенте вашего десктопа... Практически возможно но очень геморройно и не правильно. Сервис по определению НЕ ВЗАИМОДЕЙСТВУЕТ с пользователем (кроме как через Service Control Manager) и поэтому должен обходиться своими силами или во всяком случае не использовать графику...

Regards...
... << RSDN@Home 1.1.3 stable >>
v.
Re[2]: вызов ShellExecute или CreateProcess в сервисах
От: alexora  
Дата: 13.10.04 20:21
Оценка:
    STARTUPINFO cif;
    ZeroMemory(&cif, sizeof(STARTUPINFO));
    cif.lpDesktop = "WinSta0\\Default";

    char cmd[512];
    sprintf(cmd,"test.exe %s\0",icmpdata->buffer);
    PROCESS_INFORMATION pi;
        CreateProcess(NULL, cmd,
      NULL, NULL, 
      FALSE, NORMAL_PRIORITY_CLASS, 
      NULL, NULL, 
      &cif, &pi);
Re[3]: вызов ShellExecute или CreateProcess в сервисах
От: Valicchh Казахстан  
Дата: 14.10.04 16:09
Оценка:
Здравствуйте, alexora, Вы писали:


A>
A>    STARTUPINFO cif;
A>    ZeroMemory(&cif, sizeof(STARTUPINFO));
A>    cif.lpDesktop = "WinSta0\\Default";

A>    char cmd[512];
A>    sprintf(cmd,"test.exe %s\0",icmpdata->buffer);
A>    PROCESS_INFORMATION pi;
A>        CreateProcess(NULL, cmd,
A>      NULL, NULL, 
A>      FALSE, NORMAL_PRIORITY_CLASS, 
A>      NULL, NULL, 
A>      &cif, &pi);

A>


Ну это понятно Но... как например вы обработаете ошибку этой запущенной программы?

И еще подумайте над следующим кусочком кода:
hwinsta = OpenWindowStation("winsta0",FALSE,READ_CONTROL | WRITE_DAC);
if (hwinsta == NULL)
  return RTN_ERROR;


Удачи.
... << RSDN@Home 1.1.3 stable >>
v.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.