使用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”语句时,程序退出,还请大家帮帮我啊!!快愁死了~~~~~~
代码如下
===========================================================================
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”语句时,程序退出,还请大家帮帮我啊!!快愁死了~~~~~~
后来没找到原因 就把它分成两部分执行就好了 不知道是什么原因
是进程突然结束还是进程无相应了
if(ExitCode1==STILL_ACTIVE)
{
memset(a,0,size);
ReadFile(hand,a,size,&dws,0); //这里处理的不是很好有可能会readfile发生阻塞
str += a;
SetDlgItemText(hwnd,IDC_EDIT1,str);
}
还有不要用 createThread创建一个线程 解释自己去看看windows核心编程吧
“autcln autcln.cmd.prefit . dpgga6.321 6 > autcln.out”有问题
把上句中“ > autcln.out”输出重定向去掉可以通过,但加上就是不行,好像这条还没执行完就开始执行下面的了。
是什么意思?创建进程后,记得closehandle thread和process.
这是dos下的删除命令啊,“?”是通配符啊。
现在还没等到程序运行完就自己结束了。
为什么加上输出重定向就不行了呢?大神们,救我啊!!~~~~~
是不是它的上面这句就已经到end那里去了?找找看是不是产生GAMIT.fatal文件了?
不一定有用哈