迷你5207专属论坛

注册

 

发新话题 回复该主题

[Delphi] 如何检查ShellExecuteEx调用的程序的运行状态 [复制链接]

发表者
我通过ShellExecute打开一个程序,我希望能知道这个我打开的程序是否已经关闭,如果关闭我要做一些处理..... 现在我想到的是打开后,将消息循环死掉,然后一直检查这个进程是否完成,完成的话就退出消息循环. 现在不知道如何检查这个程序的运行状态...
本主题由 皇帝 5207 于 2010-3-13 0:04:21 执行 主题置顶/取消 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
沙发

回复: 如何检查外部调用程序的状态

  1. CreateProcess
  2. The CreateProcess function creates a new process and its primary thread. The new process executes the specified executable file.

  3. BOOL CreateProcess(  LPCTSTR lpApplicationName,// pointer to name of executable module  
  4.         LPTSTR lpCommandLine, // pointer to command line string  
  5.         LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes  
  6.         LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes  
  7.         BOOL bInheritHandles,  // handle inheritance flag  
  8.         DWORD dwCreationFlags, // creation flags  
  9.         LPVOID lpEnvironment,  // pointer to new environment block  
  10.         LPCTSTR lpCurrentDirectory,   // pointer to current directory name  
  11.         LPSTARTUPINFO lpStartupInfo,  // pointer to STARTUPINFO  
  12.         LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION);

  13. 先用这个函数打开程序,再用最后一个参数中的 dwProcessId 作为参数,调用OpenProcess 就可以知道进程是否退出。
  14. typedef struct _PROCESS_INFORMATION {
  15.         // pi    
  16.         HANDLE hProcess;    
  17.         HANDLE hThread;    
  18.         DWORD dwProcessId;    
  19.         DWORD dwThreadId;
  20. } PROCESS_INFORMATION;

  21. 另外,CreateProcess 的返回值如下

  22. Return ValuesIf the function succeeds, the return value is nonzero.
  23. If the function fails, the return value is zero. To get extended error information, call [url=mkMSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\winbase.chm::/devdoc/live/pdwbase/errors_3uwi.htm]GetLastError[/url].

  24. 当返回值为0的时候,证明函数执行错误,可以使用GetLastError获得更多的信息。
复制代码
我们都在人生的舞台上笨拙地舞蹈着,并自得其乐。
----
Tel : 13655310832
TOP
凳子

回复:如何检查外部调用程序的状态

如果你还是想用ShellExecute,又想在程序外面检测程序状态,则需要使用 ShellExecuteEx。 例如:     m_localFilePath="C:\DocExc006926.doc";     SHELLEXECUTEINFO ShExecInfo ;     memset(&ShExecInfo,0,sizeof(SHELLEXECUTEINFO));     ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);     ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;     ShExecInfo.hwnd = NULL;     ShExecInfo.lpVerb = "open";     ShExecInfo.lpFile =(LPCTSTR)m_localFilePath;     ShExecInfo.lpParameters = NULL;     ShExecInfo.lpDirectory = NULL;     ShExecInfo.nShow = SW_NORMAL;     ShExecInfo.hInstApp = NULL;     ShellExecuteEx(&ShExecInfo);     DWORD exCode;     GetExitCodeProcess(ShExecInfo.hProcess,&exCode);     while(exCode==STILL_ACTIVE)     {         Sleep(10);         MSG msg;         memset(&msg,0,sizeof(MSG));         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))         {             TranslateMessage(&msg);             DispatchMessage(&msg);         }         GetExitCodeProcess(ShExecInfo.hProcess,&exCode);     } 备注: 以上代码为VC代码 。。。
我们都在人生的舞台上笨拙地舞蹈着,并自得其乐。
----
Tel : 13655310832
TOP
地板

回复:如何检查外部调用程序的状态

顺便说一声,上面文章的原始地址为 http://wking.yculblog.com/post.680483.html 思路相当明确。
我们都在人生的舞台上笨拙地舞蹈着,并自得其乐。
----
Tel : 13655310832
TOP
5#

回复:如何检查外部调用程序的状态

能不能给个DELPHI的解决方案,这个我看了有点晕,呵呵.
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
6#

回复:如何检查外部调用程序的状态

我试一下 不过最近时间比较少 不知道什么时候才能发上来。
我们都在人生的舞台上笨拙地舞蹈着,并自得其乐。
----
Tel : 13655310832
TOP
7#

回复: 如何检查外部调用程序的状态

看看这个能否解决你的问题。
ShellExecute.rar (, 下载次数:426)

可执行文件(2007-7-9 10:34:56 上传)

ShellExec_source.rar (, 下载次数:450)

工程源码(2007-7-9 10:34:56 上传)

    已有1评分我要评分查看所有评分

    我们都在人生的舞台上笨拙地舞蹈着,并自得其乐。
    ----
    Tel : 13655310832
    TOP
    8#

    回复:如何检查外部调用程序的状态

    谢谢老兄,确实可以解决问题。。。
    相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
    TOP
    9#

    回复:如何检查外部调用程序的状态

    :)
    相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
    TOP
    发新话题 回复该主题