随笔 - 89  文章 - 118  trackbacks - 0
<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

留言簿(16)

随笔分类(56)

随笔档案(89)

文章分类

推荐博客

搜索

  •  

最新随笔

最新评论

阅读排行榜


假设需要执行的程序如下:


int main(int argc, char* argv[])
{
    
return argc;
}


执行它,并取得其返回值,我写了一个函数如下:

DWORD         WinExecAndWait32(    LPCTSTR lpszAppPath,   // 执行程序的路径
                                LPCTSTR lpParameters,  // 参数
                                LPCTSTR lpszDirectory, // 执行环境目录
                                DWORD dwMilliseconds)  // 最大等待时间, 超过这个时间强行终止
{
    SHELLEXECUTEINFO ShExecInfo 
= {0};
    ShExecInfo.cbSize    
= sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask    
= SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd        
= NULL;
    ShExecInfo.lpVerb    
= NULL;
    ShExecInfo.lpFile    
= lpszAppPath;        
    ShExecInfo.lpParameters 
= lpParameters;    
    ShExecInfo.lpDirectory    
= lpszDirectory;
    ShExecInfo.nShow    
= SW_HIDE;
    ShExecInfo.hInstApp 
= NULL;    
    ShellExecuteEx(
&ShExecInfo);

    
// 指定时间没结束
    if (WaitForSingleObject(ShExecInfo.hProcess, dwMilliseconds) == WAIT_TIMEOUT)
    {    
// 强行杀死进程
        TerminateProcess(ShExecInfo.hProcess, 0);
        
return 0;    //强行终止
    }

    DWORD dwExitCode;
    BOOL bOK 
= GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);
    ASSERT(bOK);

    
return dwExitCode;
}

我上传了两个工程,希望对大家有所帮助!

http://www.cppblog.com/Files/humanchao/ExecExe.rar

posted on 2007-12-28 11:20 胡满超 阅读(5954) 评论(4)  编辑 收藏 引用

FeedBack:
# re: VC中怎么执行一个应用程序,并取得应用程序的返回值 2007-12-28 13:31 FongLuo
很有参考价值哦。  回复  更多评论
  
# re: VC中怎么执行一个应用程序,并取得应用程序的返回值 2007-12-28 13:44 胡满超
@FongLuo
谢谢支持!  回复  更多评论
  
# re: VC中怎么执行一个应用程序,并取得应用程序的返回值 2007-12-29 11:41 teli
如果被调用程序挂掉了怎么办  回复  更多评论
  
# re: VC中怎么执行一个应用程序,并取得应用程序的返回值 2007-12-29 14:13 胡满超
我没有想到怎样去检查挂掉的程序,在实际应用中我是采用估算一个最大执行时间,如果超过此时间,即强行终止程序。

因为要取得子进程执行结束的返回值,所以要用上面的方法。如果不要求取得返回值,把:

ShellExecuteEx(&ShExecInfo);

以下的代码去掉就是了,主进程依然可以继续下向执行。

如果不考虑子进程的执行时间,即要求主进程一直等待子进程结束,那就把:

WaitForSingleObject(ShExecInfo.hProcess, dwMilliseconds);

改成

WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

不过这样做子进程一旦挂了,主进程也就一直停在那里了。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理