急需高手救命啊~ 为什么在使用CreateProcess函数后,调用CloseHandle之前必须使用AfxMessageBox(),否则就在运行时死机?

rsp19801226 2007-05-21 04:48:22
各位高手帮帮忙啊!
为什么在使用CreateProcess函数后,调用CloseHandle之前必须使用AfxMessageBox(),否则就在运行时死机?
if(!CreateProcess(NULL,tmp.GetBuffer(0),NULL,NULL,TRUE,0,NULL,tmpn.GetBuffer(0),&sui,&pi))
{
CloseHandle(hRead);
CloseHandle(hWrite);
hRead = NULL;
hWrite = NULL;
return;
}
else
{
AfxMessageBox("编译成功");
char buf[400];
DWORD dwRead;
if(!ReadFile(hRead,buf,400,&dwRead,NULL))
{
return;
}
strShowCompiler = buf;
AppandToShow(buf);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

}


只要注释掉 //AfxMessageBox("编译成功");
就会在运行的时候死机!
还有个问题:
我创建的匿名管道使用标准输入输出和标准出错,为什么我得到的没有vc编译器的比如warning,error之类的,只有一些微软的公司信息呢?
...全文
417 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rsp19801226 2007-05-22
  • 打赏
  • 举报
回复
还有就是后面的那个小问题都没有错误的提示,只有微软的公司信息,是不是, 那些信息不在标准通道里,如果是在什么地方呢?
rsp19801226 2007-05-22
  • 打赏
  • 举报
回复
谢谢,等结贴时会给分的,现在还有些问题,就是WaitForSingleObject好象会阻塞程序,还有其他的方法吗?
theendname 2007-05-22
  • 打赏
  • 举报
回复
HANDLE hProcess = CreateProcess(NULL,tmp.GetBuffer(0),NULL,NULL,TRUE,0,NULL,tmpn.GetBuffer(0),&sui,&pi);
if(!hProcess )
{
CloseHandle(hRead);
CloseHandle(hWrite);
hRead = NULL;
hWrite = NULL;
return;
}
else
{
WaitForSingleObject( hProcess, INFINITE );
................
rsp19801226 2007-05-22
  • 打赏
  • 举报
回复
我改成下面这样,但结果一样,只要注释掉的话,就会弹出DOS框,然后一直都不动了,死机了;而没有注释的话就会在弹出DOS框后,一闪就出现:编译成功对话框,运行就正常了。
// AfxMessageBox("编译成功");
char buf[400];
DWORD dwRead;
if(!ReadFile(hRead,buf,400,&dwRead,NULL))
{
return;
}
strShowCompiler = buf;
AppandToShow(buf);

CloseHandle(hWrite);

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
todototry 2007-05-22
  • 打赏
  • 举报
回复
把hWrite管道句柄关了,畸形管道了
rsp19801226 2007-05-22
  • 打赏
  • 举报
回复
只要不注释就可以运行AfxMessageBox("编译成功");就可以运行正常!
rsp19801226 2007-05-22
  • 打赏
  • 举报
回复
这是前面的:
CString strPathName = GetPathName();

int index1 = strPathName.ReverseFind('.');
CString tmp = strPathName;
strPathName = strPathName.Left(index1);
if(2 == (tmp.GetLength() - strPathName.GetLength()))
{
tmp = "cl.exe \/c " + strPathName + ".c";
}
else
{
tmp = "cl.exe \/c " + strPathName + ".cpp";
}
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
if(!CreatePipe(&hRead,&hWrite,&sa,0))
{
AfxMessageBox("创建匿名管道失败");
return;
}
STARTUPINFO sui;
PROCESS_INFORMATION pi;
ZeroMemory(&sui,sizeof(STARTUPINFO));
sui.cb = sizeof(STARTUPINFO);
sui.dwFlags = STARTF_USESTDHANDLES;
sui.hStdInput = hRead;
sui.hStdOutput = hWrite;
sui.hStdError = GetStdHandle(STD_ERROR_HANDLE);
int count = tmp.ReverseFind('\\');
CString tmpn;
tmpn = tmp.Left(count);
tmpn = tmpn.Right(tmpn.GetLength()-10);
todototry 2007-05-22
  • 打赏
  • 举报
回复
CreateProcess(NULL,tmp.GetBuffer(0),NULL,NULL,TRUE,0,NULL,tmpn.GetBuffer(0),&sui,&pi);
===========================================
你创建什么进程跑的,你的commandline里面格式对么,先显式的传值
rsp19801226 2007-05-22
  • 打赏
  • 举报
回复
我试过了,会出现前面的那种情况,还是之前那个好用,决定就用那个了.
theendname 2007-05-22
  • 打赏
  • 举报
回复
WaitForInputIdle()
用这个吧!!

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧