2013-01-18 2 views
0

에 의해 중단 :CreateProcess를 내가 DLL 내부에이 기능이 기본적

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) 두 번째로 함수는 작동하지만 일시 중단 된 상태에서 하위 프로세스를 만들고 상위 프로세스의 CPU 사용량은 100 %가됩니다.

임 WINXP와의 SP3와 테스트, 내 DLL은 2010 년

어떤 도움 대에서 컴파일 ?

+2

당신이 당신의'STARTUPINFO' 구조에서 초기화있는 유일한 방법은'cb' 회원입니다. 나머지는 초기화되지 않은 쓰레기입니다. 결과는 예측할 수 없습니다. –

+0

음 STARTUPINFO라고 생각하십니까? – jsilva

답변

4

STARTUPINFO 구조의 cbSize 필드를 초기화했지만 나머지는 초기화되지 않은 상태로 두었습니다. 처음으로 CreateProcess으로 전화 할 때 초기화되지 않은 값은 분명히 입니다. 따라서은 함수가 잘못되었다고 인식하여 잘못 인식합니다. 너는 럭키이었다.

두 번째로 호출 할 때 값은 분명히 CreateProcess이 수행 방법을 아는 것으로 생각하여 진행합니다. 그러한 것은 정의되지 않은 행동의 본질이다.

는이 문제를 해결 구조체의 모든 초기화 :

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

알았어, 나는 당신의 sugestion을 추가하는 약간의 변화를 만들었고, 이제는 errror code가 항상 1이다. – jsilva

+0

콘솔이 아닌 프로그램을위한 새 콘솔을 만들라고 말하고 있기 때문일 수도 있습니다. 그러나이 질문의 범위를 넘어서는 것은 프로세스가 중단 된 이유입니다. –

+0

당신이 옳습니다. Rob, 고마워. – jsilva

관련 문제