我在 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;
}
我发现了两个问题:
1) 第一次调用该函数,总是返回错误代码87(参数不正确)。
2)第二次,该函数起作用,但创建了一个处于挂起状态的子进程,并且父进程的CPU使用率达到100%。
我用winXP sp3进行测试,我的dll是在vs 2010中编译的。
有什么帮助吗?
您已经初始化了cbSize
你的领域STARTUPINFO
结构,但其余部分未初始化。第一次打电话的时候CreateProcess
,未初始化的值显然是so wrong该函数认识到它们是错误的并放弃。你之前是lucky.
第二次调用它时,这些值显然是这样的CreateProcess
认为你已经要求它做一些它知道如何做的事情,所以它会继续。这就是未定义行为的本质。
要解决此问题,请初始化all结构体的:
STARTUPINFO si = {sizeof(STARTUPINFO)};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)