怎么让WINEXEC函数阻塞??

cniao 2003-04-21 06:50:15
就是让他结束后程序再进行下一步。
比如:
...
winexec("dir c:\/s",sw_hide);
MessageBox (....)
...


等DIR把所有的文件都列出,命令结束后,再进行下一步的MSGBOX。
...全文
718 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
free_card 2003-04-21
  • 打赏
  • 举报
回复
在这里提供了一个名为Wait的函数,它会为你完成上面的功能。实现的思想
是在启动进程后等待其结束,由于进程是一种资源,而资源的句柄在WIN32中
可以作为核心量使用。你可以使用WaitForSingleObject等待核心量状态改变
为有信号状态。对进程来讲当进程结束时其状态转变为有信号。

在本例中使用了一个单独的线程来启动进程并等待结束。

Wait()
BOOL Wait(CString szCmdLine)
{
LPTHREADINFO pThreadInfo = new THREADINFO;
CEvent *pThreadEvent = new CEvent(FALSE, TRUE);
ASSERT_VALID(pThreadEvent);
if(pThreadInfo)
{
pThreadInfo->pTermThreadEvent = pThreadEvent;
pThreadInfo->strPathName = szCmdLine;

AfxBeginThread(LaunchAndWait, pThreadInfo);
WaitForSingleObject(pThreadEvent->m_hObject, INFINITE);
return TRUE;
}
return FALSE;
}

LaunchAndWait()
UINT LaunchAndWait(LPVOID pParam)
{
LPTHREADINFO pThreadInfo = (LPTHREADINFO) pParam;
PROCESS_INFORMATION stProcessInfo;
if(LaunchApplication(pThreadInfo->strPathName, &stProcessInfo))
{
HANDLE hThreads[2];
hThreads[0] = pThreadInfo->pTermThreadEvent->m_hObject;
hThreads[1] = stProcessInfo.hProcess;
DWORD dwIndex = WaitForMultipleObjects(2, hThreads, FALSE, INFINITE);
CloseHandle(stProcessInfo.hThread);
CloseHandle(stProcessInfo.hProcess);
pThreadInfo->pTermThreadEvent->SetEvent();
if(pThreadInfo)
delete pThreadInfo;
}
else
pThreadInfo->pTermThreadEvent->SetEvent();
return 0;
}


LaunchApplication()
BOOL LaunchApplication(LPCTSTR pCmdLine, PROCESS_INFORMATION *pProcessInfo)
{
STARTUPINFO stStartUpInfo;

memset(&stStartUpInfo, 0, sizeof(STARTUPINFO));

stStartUpInfo.cb = sizeof(STARTUPINFO);

stStartUpInfo.dwFlags = STARTF_USESHOWWINDOW;
stStartUpInfo.wShowWindow = SW_SHOWDEFAULT;

return CreateProcess(NULL, (LPTSTR)pCmdLine, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL,
NULL, &stStartUpInfo, pProcessInfo);
}

masterz 2003-04-21
  • 打赏
  • 举报
回复
use createprocess

PROCESS_INFORMATION pi;
STARTUPINFO si;
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = 0;
si.cbReserved2 = 0;
si.lpReserved2 = NULL;
BOOL bres = CreateProcess(NULL,"test a.txt b.txt",NULL,NULL,false,
NORMAL_PRIORITY_CLASS,
NULL,NULL,&si,&pi);
if(bres==false)
{
AfxMessageBox("CreateProcess failed");
}
else
{
CloseHandle(pi.hThread);
DWORD dwret=WaitForSingleObject(pi.hProcess, 1000*30);
switch(dwret)
{
case WAIT_OBJECT_0:
DWORD dwexitcode;
bres = GetExitCodeProcess(pi.hProcess,&dwexitcode);
TCHAR exitmsgbuf[1024];
if(bres)
{
wsprintf(exitmsgbuf,"exit code:%d",dwexitcode);
}
else
wsprintf(exitmsgbuf,"exit code failed to return");

AfxMessageBox(exitmsgbuf);
break;
default:
AfxMessageBox("exit for other reason");
}
CloseHandle(pi.hProcess);
}

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧