在一个线程中,使用CreateProcess启动了一个.Bat文件,不知道该怎么关闭出现的CMD窗口,请帮忙,谢谢! 在一个线程中,使用CreateProcess启动了一个.Bat文件,不知道该怎么关闭出现的CMD窗口,即使我关闭了这个线程也不能将CMD窗口关闭,而且线程也堵塞了,再给现成发消息都收不到了,只能把这个CMD手动关掉后才可以,当然我是用WaitForSingleObject,因为我希望BAT文件执行完成后,我能知道,大家有没有什么解决方案呢,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 能看一下CreateProcess函数你是怎么调用的么?我指参数都是什么? if( !CreateProcess( NULL, // No module name (use command line). (LPTSTR)(LPCTSTR)strBatFileName, // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. NULL, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi // Pointer to PROCESS_INFORMATION structure. ) ) { bReturnVal = FALSE; } else { WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } return bReturnVal; 要么用ShellExute,要么在BAT文件最后一行加上“exit”试试。 这样:1. 用AllocConsole创建一个Console窗口。2. 用GetConsoleWindow取得Console窗口的句柄。3. 把Console窗口Hide掉,用ShowWindow(...)。4. 调用CreateProcess。我没试过,你试试看。 同意xqchang(),加上exit会自动退出。 我的BAT文件执行完成后是会自动退出的,我之所以用Wait就是为了等待 BAT文件执行结束,好进行下面的操作,请大家再给看看 那是Wait不能结束?还是结束后Console窗口还没关掉? 是在WAIT的时候,主程序退出,也想让CONSOLE退出,可是,主程序能退,CONSOLE却退不了 那是自己写的 .bat 有问题啊。一般.bat运行后自己会结束关闭窗口的。用不着手工去关闭。检查你写的.bat文件。 你是想在批处理文件没有结束前,主程序退出,让批处理文件的cmd窗口也关闭吧。你可以注意一下,你用createprocess加载了那个批处理文件之后,在你的进程管理器中,你是找不到那个与你的批处理文件对应的进程名和进程id的,其中多出来的进程名是在你的批处理文件中启动的程序的名字,所以,你可以考虑一下两种方法:1,在主程序退出是根据进程名terminateprocess掉那个有批处理文件启动的进程;2,不要加载那个批处理文件,而是直接加载批处理文件中启动的那些进程 那是自己写的 .bat 有问题啊。一般.bat运行后自己会结束关闭窗口的。用不着手工去关闭。检查你写的.bat文件。----------------------楼上的正解 麻烦高手帮看一小段C语言程序 IHTMLElement6 提示没标识 两个问题 轻问:WSARecv中使用完成例程模型出现的问题 一个程序里可不可以有两个Frame(由打印引出的问题) 如何控制树控件的子项可编辑? 高分相赠,请给我两个用vc开发数据库的例子!非常感谢!在线等待! 有关数据类型转换的菜鸟问题 vc++中如何捕获Edit控件中的回车消息 数字转化为图片问题 请问用ADO如何获得Access表某一行中某几列的数据值? 关于定时器的设置问题
(LPTSTR)(LPCTSTR)strBatFileName, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
NULL, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi // Pointer to PROCESS_INFORMATION structure.
)
)
{
bReturnVal = FALSE;
}
else
{
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
} return bReturnVal;
1. 用AllocConsole创建一个Console窗口。
2. 用GetConsoleWindow取得Console窗口的句柄。
3. 把Console窗口Hide掉,用ShowWindow(...)。
4. 调用CreateProcess。我没试过,你试试看。
一般.bat运行后自己会结束关闭窗口的。
用不着手工去关闭。检查你写的.bat文件。
你可以注意一下,你用createprocess加载了那个批处理文件之后,在你的进程管理器中,你是找不到
那个与你的批处理文件对应的进程名和进程id的,其中多出来的进程名是在你的批处理文件中启动的程序的名字,所以,你可以考虑一下两种方法:1,在主程序退出是根据进程名terminateprocess掉那个有批处理文件启动的进程;2,不要加载那个批处理文件,而是直接加载批处理文件中启动的那些进程
一般.bat运行后自己会结束关闭窗口的。
用不着手工去关闭。检查你写的.bat文件。
----------------------楼上的正解