使用CreateProcess调用一个批处理文件,直接调用时没有问题,但当建立一个匿名管道将控制台信息输出到对话框时,批处理文件执行到一半就自动终止,不知是什么原因,还请达人们帮助啊!!~~~~
代码如下
===========================================================================
LRESULT CBaseLine::OnStartBsl2(WPARAM wParam,LPARAM lParam)
{
SECURITY_ATTRIBUTES  sk1;
sk1.bInheritHandle = TRUE;
sk1.lpSecurityDescriptor = NULL;
sk1.nLength = sizeof(SECURITY_ATTRIBUTES);
CreatePipe(&hand0,&hand1,&sk1,0); workpath = theApp.syspath;
workpath += "\\BASELINE";   //得到程序运行路径(即程序存放路径) exe1name = workpath;      
exe1name += "\\bpgga6.bat"; //第二部分可执行程序 STARTUPINFO strinfo1;
ZeroMemory(&strinfo1, sizeof(STARTUPINFO));
strinfo1.cb = sizeof(STARTUPINFO);
strinfo1.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; // strinfo1.hStdOutput = hand1;
strinfo1.hStdError = GetStdHandle(STD_ERROR_HANDLE);
strinfo1.wShowWindow = SW_HIDE; BOOL ret = CreateProcess(exe1name,NULL,NULL,NULL,TRUE,0,NULL,workpath,&strinfo1,&processinfo1); theApp.h_bsl1 = processinfo1.hProcess;
pk1->hand = hand0;
pk1->pi = theApp.h_bsl1;
duqu1(); return 0;
}BOOL CBaseLine::duqu1()
{
HANDLE hand02 = CreateThread(NULL,0,ThreadProc1,(LPVOID)pk1,0,NULL);
if(!hand02)
{
AfxMessageBox("ERROR");
return FALSE;
}
return TRUE;
}DWORD WINAPI ThreadProc1(LPVOID lpParameter)  // thread data
{
HANDLE hand = ((ps*)lpParameter)->hand;
HWND hwnd = ((ps*)lpParameter)->hwnd;
HANDLE  pi = ((ps*)lpParameter)->pi;
CString str = ((ps*)lpParameter)->str;
DWORD dws = -1;
char *a;
int size = 4096;
a = new char[size]; DWORD   ExitCode1;
ExitCode1 = STILL_ACTIVE;
GetExitCodeProcess(pi,&ExitCode1);
while(ExitCode1==STILL_ACTIVE)
{
Sleep(50);
BOOL isget = GetExitCodeProcess(pi,&ExitCode1);
if(isget == 0)
{
AfxMessageBox("ExitCodeWrong");
}
if(ExitCode1==STILL_ACTIVE)
{
memset(a,0,size);
ReadFile(hand,a,size,&dws,0);
str += a;
SetDlgItemText(hwnd,IDC_EDIT1,str);
}
}
Sleep(50);
AfxMessageBox(":)");
::SendMessage(hwnd,WM_BASEL,0L,0L); return 0;
}
===================================================================================
bat文件内容如下:@rem
@rem
@rem Initial orbital integration
@echo off
arc    < bpgga6.001
@rem
@rem Generation of yaw file
yawtab ypgga6.321       tpgga6.321       ypggat.321         30
@rem
@rem Initial solution
model  < bpgga6.002
model  < bpgga6.003
model  < bpgga6.004
model  < bpgga6.005
model  < bpgga6.006
model  < bpgga6.007
autedit -base  autcln.cmd
autcln autcln.cmd.prefit . dpgga6.321      6 > autcln.out
@if exist GAMIT.fatal goto end
del c????a.321
ren c????6.321 c????a.321
cfmrg  < bpgga6.009      
solve <  bpgga6.010      
chksolve 
@if exist GAMIT.fatal goto fatal
@rem
@rem Post-fit editing and solution
del c????a.???
model  < bpgga6.011      
model  < bpgga6.012      
model  < bpgga6.013      
model  < bpgga6.014      
model  < bpgga6.015      
model  < bpgga6.016      
autedit -base  autcln.cmd -post                                       
autcln autcln.cmd.postfit . dpgga6.321      b > autcln.out
@if exist GAMIT.fatal goto end
del c????c.321
ren c????b.321 c????c.321
copy  mpggaa.321 mpggaa.321.autcl
cfmrg  < bpgga6.017      
sigelv -nfile npggac.321 -qfile qpggap.321               -acmd autcln.cmd.postfit
solve <  bpgga6.018  
==================================================================
当执行到“del c????a.321”语句时,程序退出,还请大家帮帮我啊!!快愁死了~~~~~~

解决方案 »

  1.   

    上次在程序中也用进程执行一个bat文件 也是执行到一半就死掉了
    后来没找到原因 就把它分成两部分执行就好了 不知道是什么原因
      

  2.   

    你的死是指的什么意思
    是进程突然结束还是进程无相应了
    if(ExitCode1==STILL_ACTIVE) 

    memset(a,0,size); 
    ReadFile(hand,a,size,&dws,0); //这里处理的不是很好有可能会readfile发生阻塞 
    str += a; 
    SetDlgItemText(hwnd,IDC_EDIT1,str); 

    还有不要用 createThread创建一个线程 解释自己去看看windows核心编程吧
      

  3.   

    是进程突然结束,现在发现执行批处理文件中的
    “autcln autcln.cmd.prefit . dpgga6.321      6 > autcln.out”有问题
    把上句中“ > autcln.out”输出重定向去掉可以通过,但加上就是不行,好像这条还没执行完就开始执行下面的了。
      

  4.   

    del c????a.321
    是什么意思?创建进程后,记得closehandle thread和process.
      

  5.   

    del c????a.321 
    这是dos下的删除命令啊,“?”是通配符啊。
    现在还没等到程序运行完就自己结束了。
    为什么加上输出重定向就不行了呢?大神们,救我啊!!~~~~~
      

  6.   

    @if exist GAMIT.fatal goto end 
    是不是它的上面这句就已经到end那里去了?找找看是不是产生GAMIT.fatal文件了?
      

  7.   

    没有,这点是肯定的,现在我把输出重定向去掉了,勉强可以运行,但肯定不是长久之计啊,分析后觉得应该是使用输出重定向的那条语句调用的程序还没有执行完,后面的就又开始了。因为改了一下 pangqi022 兄指出的问题,发现有“另一个程序正在使用此文件,进程无法访问。”字样,原先没有显示,估计有可能是不是阻塞了。有没有什么办法能让它运行完了再进行下一条呢?
      

  8.   

    试试start /wait "autcln autcln.cmd.postfit . dpgga6.321  b > autcln.out"
    不一定有用哈
      

  9.   

    唉,看来是不行了,最后把“> autcln.out”去掉了。。