Создание самостоятельного процесса! - PullRequest
2 голосов
/ 03 марта 2011

Я пытаюсь создать процесс из службы в C ++. Этот новый процесс создается как дочерний процесс. Я хочу создать независимый процесс, а не дочерний процесс ...

Я использую функцию CreateProcess для того же. Поскольку новый процесс, который я создаю, является дочерним процессом, когда я пытаюсь уничтожить дерево процессов на уровне сервиса, он также убивает дочерний процесс ... Я не хочу, чтобы это произошло. Я хочу, чтобы новый процесс был создан независимо от службы.

Пожалуйста, совет по тому же .. Спасибо ..

Код

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);    // Start the child process.
ZeroMemory( &pi, sizeof(pi) );
si.dwFlags = STARTF_USESHOWWINDOW;

if(bRunOnWinLogonDesktop)
{
    if(csDesktopName.empty())
        si.lpDesktop = _T("winsta0\\default");
    else
        _tcscpy(si.lpDesktop, csDesktopName.c_str());
}

if(bHide)
    si.wShowWindow = SW_HIDE;     /* maybe even SW_HIDE */
else
    si.wShowWindow = SW_SHOW;     /* maybe even SW_HIDE */



TCHAR szCmdLine[512];
_tcscpy(szCmdLine, csCmdLine.c_str());

if( !CreateProcess( NULL,
                szCmdLine,
               NULL,
               NULL,
               FALSE,
               CREATE_NEW_PROCESS_GROUP,
               NULL,        
               NULL,        
               &si,        
               &pi ) ) 

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

После закрытия обработчиков потоков и процессов дочернего процесса, он все еще является дочерним в Process Explorer, но завершение родительского процесса не приводит к завершению дочернего процесса.

CreateProcess( NULL,
            szCmdLine,
           NULL,
           NULL,
           FALSE,
           CREATE_NEW_PROCESS_GROUP,
           NULL,        
           NULL,        
           &si,        
           &pi ); 
if(pi.hThread)
    CloseHandle(pi.hTread);
if(pi.hProcess)
    CloseHandle(pi.hProcess);

Я нашел это решение в источниках cmd.exe ReactOS , в процедуре выполнения команды start.

3 голосов
/ 03 марта 2011

Создайте промежуточный процесс (используйте create_new_process_group), который затем создает реальный процесс.

Service
  -> Intermediate Process
     -> Real Process

Промежуточный процесс должен завершиться, как только он запустит реальный процесс.

...