实现操作过程提示对话框
2010-07-11 20:43:36 来源:WEB开发网在需要调用ARJ.EXE 进行压缩/ 解压缩的类中,再创建一个成员函数,不妨称作RunBat(),其作用是创建和执行进程来运行上述所生成的批处理文件,并在适当时候撤消进程。
void CMyCompress::RunBat(CString
BatPath,CString fileName,CString ExitFlag)
{
CString lpApplicationName=BatPath+""+fileName;
// 进程执行的应用程序的完全路径名
STARTUPINFO StartupInfo;// 创建进程所需的信息结构变量
GetStartupInfo(&StartupInfo);
StartupInfo.lpReserved=NULL;
StartupInfo.lpDesktop=NULL;
StartupInfo.lpTitle=NULL;
StartupInfo.dwX=0;
StartupInfo.dwY=0;
StartupInfo.dwXSize=200;
StartupInfo.dwYSize=300;
StartupInfo.dwXCountChars=500;
StartupInfo.dwYCountChars=500;
StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=SW_HIDE;
// 说明进程将以隐藏的方式在后台执行
StartupInfo.cbReserved2=0;
StartupInfo.lpReserved2=NULL;
StartupInfo.hStdInput=stdin;
StartupInfo.hStdOutput=stdout;
StartupInfo.hStdError=stderr;
LPTSTR lpBuffer;
UINT uSize;
HANDLE hHeap;
uSize=(GetCurrentDirectory(0,NULL))*sizeof(TCHAR);
hHeap=GetProcessHeap();
lpBuffer=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,uSize);
GetCurrentDirectory(uSize,lpBuffer);
// 得知当前目录信息,以便根据需要变换目录
if (lpBuffer!=BatPath) //diferent dir
SetCurrentDirectory(BatPath);
// 创建进程
if (CreateProcess(lpApplicationName,NULL,NULL,
NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,
NULL,NULL,&StartupInfo,&pro_info))
{
MSG Message;
DeleteFile(ExitFlag);
SetTimer(1,100,NULL);// 设置计时器
Search=TRUE;
while(Search) {
if (::PeekMessage(&Message,NULL,0,0,PM_REMOVE)) {
::TranslateMessage(&Message);
::DispatchMessage(&Message);
}
}
// 进程结束前后的处理工作
DWORDExitCode;
if (!GetExitCodeProcess(pro_info.hProcess,&ExitCode))
AfxMessageBox("GetExitCodeProcess is Failed!");
if (!TerminateProcess(pro_info.hProcess,(UINT)ExitCode))
// 终止进程
AfxMessageBox("TerminateProcess is Failed!");
if (!CloseHandle(pro_info.hProcess))
// 释放被终止进程的句柄
AfxMessageBox("CloseHandle is Failed!");
KillTimer(1);// 撤消计时器
}
else AfxMessageBox("Process Is Not Created!");
SetCurrentDirectory(lpBuffer);// 回复到原来的目录下
}
同时按下Ctrl 和W 键或直接单击工具条上的ClassWizard 按钮,打开ClassWizard 对话框。在类名(Class name) 列表框中选择需要调用ARJ.EXE进行压缩/ 解压缩的类,在Object IDs 列表框中选择该类的类名后,在消息(Messages) 列表框中选择WM_TIMER 消息并双击它,这时ClassWizard 就会在该类中加入一个OnTimer() 函数。该函数将以一定的时间间隔检查压缩/ 解压缩程序是否已经执行完毕,即检查作为标志的临时文件是否已经存在,并及时修改状态变量“Search”,以便通知RunBat() 函数结束进程。
void CMyCompress::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CFile file;
CFileException Error;
if (file.Open(ExitFlag,CFile::modeRead,&Error)) {
Search=FALSE;
file.Close();
}
}
更多精彩
赞助商链接