createprocess默认暂停[关闭]
Posted
技术标签:
【中文标题】createprocess默认暂停[关闭]【英文标题】:createprocess suspended by default [closed] 【发布时间】:2013-01-18 21:14:18 【问题描述】:我在 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编译的。
有什么帮助吗?
【问题讨论】:
您在STARTUPINFO
结构中初始化的唯一内容是cb
成员。其余的是未初始化的垃圾。结果将是不可预测的。
嗯,所以你认为是 STARTUPINFO?
【参考方案1】:
您已经初始化了 STARTUPINFO
结构的 cbSize
字段,但是您没有初始化其余部分。第一次调用CreateProcess
时,未初始化的值显然非常错误,以至于函数认识到它们是错误的并放弃了。你是幸运的。
您第二次调用它时,这些值显然是这样的,CreateProcess
认为您已要求它执行它知道如何执行的操作,因此它会继续执行。这就是未定义行为的本质。
要解决这个问题,请初始化结构的 all:
STARTUPINFO si = sizeof(STARTUPINFO);
【讨论】:
好的,我做了一些修改添加你的建议,现在错误码一直是1。 可能是因为您告诉它为非控制台程序创建一个新控制台。但这超出了这个问题的范围,这就是为什么进程被暂停。 你是对的。谢谢罗伯。以上是关于createprocess默认暂停[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
process_begin: CreateProcess(NULL,......) make (e=87): 参数错误。
在 CreateProcess 之后修改 STARTUPINFO
cmd.exe 在使用 CreateProcess 调用后立即关闭
读取使用 createProcess 获得的管道的几行,然后将其关闭
Delphi - 优雅地关闭服务中创建的进程。 (使用 tprocess / createProcess)
如果一个程序是由 system() 或 CreateProcess() 从另一个程序启动的,如何防止 Ctrl+Break/Ctrl+C 关闭这两个程序?