2013-01-18 27 views
0

懸浮我有一個DLL內這樣的功能:CreateProcess的默認

int createChildProcess() 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    int res; 

    si.cb=sizeof(STARTUPINFO); 

    STARTUPINFO* ptr=&si; 
    if(!CreateProcess(L"c:\\windows\\notepad.exe", NULL, 0, 0, false, CREATE_NEW_CONSOLE, 0, 0, &si, &pi)) 
    { 
     mylog << "CreateProcess error: " << GetLastError() << std::endl; 
     res = 0; 
    } 
    else 
     res = pi.dwProcessId; 

    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 

    return res; 
} 

,我發現2個問題:

1)第一次調用該函數時,則返回總是錯誤代碼87(該參數是不正確的。)。

2)第二次,該函數工作,但創建一個處於掛起狀態的子進程,父進程中的CPU使用率達到100%。

用winXP的SP3即時通訊測試,我的DLL被編譯在2010年VS

任何幫助嗎?

+2

你在你的'STARTUPINFO'結構初始化的唯一的事情是'cb'成員。其餘的是未初始化的垃圾。結果將是不可預測的。 –

+0

嗯所以你認爲是STARTUPINFO? – jsilva

回答

4

您已初始化您的STARTUPINFO結構的cbSize字段,但其餘未初始化。你第一次打電話CreateProcess,未初始化的值顯然是那麼錯誤該功能認識到他們錯了,放棄。你是幸運

第二次調用它時,值顯然是這樣的,CreateProcess認爲你已經要求它做一些它知道該怎麼做的事情,所以它會繼續。這是未定義行爲的本質。

爲了解決這個問題,初始化結構的所有

STARTUPINFO si = {sizeof(STARTUPINFO)}; 
+0

好吧,我做了一些修改,添加了你的消息,現在錯誤代碼一直是1。 – jsilva

+0

也許是因爲你正在告訴它爲非控制檯程序創建一個新的控制檯。但這超出了這個問題的範圍,這就是爲什麼這個過程被暫停。 –

+0

你是對的。感謝Rob。 – jsilva