如何知道用CreateProcess创建的进程已执行结束?

pinemail 2002-07-20 11:13:59
在程序中,我调用CreateProcess函数来创建一个进程,我如何知道这个进程什么时候执行完成呢?
Thx
...全文
418 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingzai 2002-07-20
  • 打赏
  • 举报
回复
UINT ProcessStatus(LPVOID pParam)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
BOOL fRet=CreateProcess(NULL,
"d:\\temp\\disk1\\setup.exe -r",
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
if(fRet)
{
m_hPro=pi.hProcess;//保存当前进程句柄,在强制结束进程时使用。
}
if(::WaitForSingleObject(m_hPro,INFINITE)==WAIT_OBJECT_0)
{
AfxMessageBox("the Process is go over");
}
CloseHandle(m_hPro);
return 0;
}
椒椒子 2002-07-20
  • 打赏
  • 举报
回复
The GetExitCodeProcess function retrieves the termination status of the specified process.
BOOL GetExitCodeProcess(
HANDLE hProcess, // handle to the process
LPDWORD lpExitCode // termination status
);
jfzsl 2002-07-20
  • 打赏
  • 举报
回复
用GetExitCodeThread这个东东,具体参加MSDN
jmcooler 2002-07-20
  • 打赏
  • 举报
回复
还有两个办法为:
while( GetProgressExitCode( hProgress ) == STILLACTIVE )
Sleep( 0 );

下面也是一个办法:
C/C++ Code Example: Retrieving Task Exit Code
This example retrieves the last exit code returned by a known task. (A returned value of "0" indicates the task was never run.) The example assumes that the task, Test Task, already exists on the local computer.

#include <windows.h>
#include <initguid.h>
#include <ole2.h>
#include <mstask.h>
#include <msterr.h>
#include <wchar.h>

int main(int argc, char **argv)
{
HRESULT hr = ERROR_SUCCESS;


///////////////////////////////////////////////////////////////////
// Call CoInitialize to initialize the COM library and then
// CoCreateInstance to get the Task Scheduler object.
///////////////////////////////////////////////////////////////////
ITaskScheduler *pITS;
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_CTaskScheduler,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITaskScheduler,
(void **) &pITS);
if (FAILED(hr))
{
CoUninitialize();
return 1;
}
}
else
{
return 1;
}


///////////////////////////////////////////////////////////////////
// Call ITaskScheduler::Activate to get the Task object.
///////////////////////////////////////////////////////////////////
ITask *pITask;
LPCWSTR lpcwszTaskName;
lpcwszTaskName = L"TestTask";
hr = pITS->Activate(lpcwszTaskName,
IID_ITask,
(IUnknown**) &pITask);

// Release ITaskScheduler interface.
pITS->Release();

if (FAILED(hr))
{
wprintf(L"Failed calling ITaskScheduler::Activate: ");
wprintf(L"error = 0x%x\n",hr);
CoUninitialize();
return 1;
}


///////////////////////////////////////////////////////////////////
// Call ITask::GetExitCode. Note that this method is
// inherited from IScheduledWorkItem.
///////////////////////////////////////////////////////////////////
DWORD pdwExitCode;

hr = pITask->GetExitCode(&pdwExitCode);

// Release ITask interface.
pITask->Release();

if (FAILED(hr))
{
wprintf(L"Failed calling ITask::GetExitCode: ");
wprintf(L"error = 0x%x\n",hr);
CoUninitialize();
return 1;
}


wprintf(L"The last exit code of Test Task is: %d\n", pdwExitCode);


CoUninitialize();
return 0;
}
jmcooler 2002-07-20
  • 打赏
  • 举报
回复
WaitForSingleObject( 你的进程句柄, INFINITE );

查看MSDN里关于WaitForSingleObject的帮助就知道,它可以用来等待一个进程的结束,WaitForSingleObject执行时,就会等在那里,但不占用CPU时间,一旦正等待的进程退出,WaitForSingleObject才返回,上面的INFINITE是无限等待下去的意思。
pinemail 2002-07-20
  • 打赏
  • 举报
回复
谢谢大家!
虽然问题仍然没有解决。。。
开新帖继续问!
呵呵~~~

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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