我在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个问题:
1)第一次调用该函数时,总是返回错误代码87(参数不正确。)。
2)第二次,该函数工作,但创建一个处于挂起状态的子进程,并且父进程中的cpu使用率达到100%。
我使用winXP sp3测试,我的dll是在vs 2010中编译的。
任何帮助?
答案 0 :(得分:4)
您已初始化cbSize
结构的STARTUPINFO
字段,但您已将其余字段保留为未初始化状态。第一次调用CreateProcess
时,未初始化的值显然是错误,函数会识别出它们是错误的并放弃了。你幸运。
第二次调用它时,值显然是CreateProcess
认为你已经要求它做一些它知道怎么做的事情,所以它继续进行。这就是未定义行为的本质。
要解决此问题,请初始化所有结构:
STARTUPINFO si = {sizeof(STARTUPINFO)};