在一个线程中,使用CreateProcess启动了一个.Bat文件,不知道该怎么关闭出现的CMD窗口,即使我关闭了这个线程也不能将CMD窗口关闭,而且线程也堵塞了,再给现成发消息都收不到了,只能把这个CMD手动关掉后才可以,当然我是用WaitForSingleObject,因为我希望BAT文件执行完成后,我能知道,大家有没有什么解决方案呢,谢谢!

解决方案 »

  1.   

    能看一下CreateProcess函数你是怎么调用的么?我指参数都是什么?
      

  2.   

    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;
      

  3.   

    要么用ShellExute,要么在BAT文件最后一行加上“exit”试试。
      

  4.   

    这样:
    1. 用AllocConsole创建一个Console窗口。
    2. 用GetConsoleWindow取得Console窗口的句柄。
    3. 把Console窗口Hide掉,用ShowWindow(...)。
    4. 调用CreateProcess。我没试过,你试试看。
      

  5.   

    同意xqchang(),加上exit会自动退出。
      

  6.   

    我的BAT文件执行完成后是会自动退出的,我之所以用Wait就是为了等待 BAT文件执行结束,好进行下面的操作,请大家再给看看
      

  7.   

    那是Wait不能结束?还是结束后Console窗口还没关掉?
      

  8.   

    是在WAIT的时候,主程序退出,也想让CONSOLE退出,可是,主程序能退,CONSOLE却退不了
      

  9.   

    那是自己写的 .bat 有问题啊。
    一般.bat运行后自己会结束关闭窗口的。
    用不着手工去关闭。检查你写的.bat文件。
      

  10.   

    你是想在批处理文件没有结束前,主程序退出,让批处理文件的cmd窗口也关闭吧。
    你可以注意一下,你用createprocess加载了那个批处理文件之后,在你的进程管理器中,你是找不到
    那个与你的批处理文件对应的进程名和进程id的,其中多出来的进程名是在你的批处理文件中启动的程序的名字,所以,你可以考虑一下两种方法:1,在主程序退出是根据进程名terminateprocess掉那个有批处理文件启动的进程;2,不要加载那个批处理文件,而是直接加载批处理文件中启动的那些进程
      

  11.   

    那是自己写的 .bat 有问题啊。
    一般.bat运行后自己会结束关闭窗口的。
    用不着手工去关闭。检查你写的.bat文件。
    ----------------------楼上的正解