2011-03-03 69 views
2

我想從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)) 
+0

'CREATE_NEW_PROCESS_GROUP'標誌有幫助嗎? – sharptooth 2011-03-03 06:17:21

+0

重複? http://stackoverflow.com/questions/3136154/how-to-create-a-process-that-is-not-a-child-of-its-creating-process – young 2011-03-03 06:19:36

+1

你爲什麼要在第一個殺死進程樹地點? – 2011-03-03 06:32:59

回答

3

創建一箇中間過程(使用create_new_process_group),然後創建一個真正的過程。

Service 
    -> Intermediate Process 
    -> Real Process 

中間過程一旦啓動真正的過程就應該退出。

4

關閉子進程的線程和進程處理程序後,它仍然是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); 

我發現這個決定在ReactOSsources of cmd.exe,在執行的過程「啓動」命令。