我想运行起一个exe文件,我测试了2中方法,发现一个问题,不太懂
第一种运行方式:
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof SHELLEXECUTEINFO;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpFile = _T("explorer");
sei.lpParameters = _T("E:\\downloads\\Dbgview.exe");
sei.nShow = SW_SHOW;
::ShellExecuteEx(&sei);
if(sei.hProcess)
{
DWORD dwProcId = ::GetProcessId(sei.hProcess);
ATLTRACE2(_T("==========>Proc Id:%d\n"), dwProcId);
}
else
{
ATLTRACE(_T("==========>Process handle is null\n"));
}
运行起来的时候,打印出来的ProcessID和任务管理器里面的不一样。而且和任务管理器里面的explorer.exe进程也不一样。反正就是任务管理器里面找不到。
第二种:
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof SHELLEXECUTEINFO;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpFile = _T("E:\\downloads\\Dbgview.exe");
sei.nShow = SW_SHOW;
::ShellExecuteEx(&sei);
if(sei.hProcess)
{
DWORD dwProcId = ::GetProcessId(sei.hProcess);
ATLTRACE2(_T("==========>Proc Id:%d\n"), dwProcId);
}
else
{
ATLTRACE(_T("==========>Process handle is null\n"));
}
打印出来的ProcessID和任务管理器里面的一样。问一个问题,区别在哪儿?为什么有这样的区别。

解决方案 »

  1.   

    第一种情况你是启动了一个新的Explorer(不是当前桌面的Explorer),让这个Explorer来启动一个Dbgview,此时返回的句柄是Explorer的, 这个Explorer在启动Dbgview后退出了,所以你在任务管理器里面看不到。第二种情况是直接启动的dbgview程序,得到是dbgview的句柄。
      

  2.   

    再问一下,既然被启动起来的explorer那个进程,只是启动了Dbgview.exe就退出了,可是为什么我还能使用GetProcessId获取到ProcessID呢?是因为我没有使用CloseHandle关闭掉这个handle,也没有释放掉资源,所以这个内核对象还存在,所以我能获取到,是这样么?
      

  3.   


    你可以Sleep几秒后再GetProcessId试试
      

  4.   


    我在调用ShellExecuteEx之后,Sleep几秒钟,再次去获取ProcessID,还是能获取到,不知道为什么。
    我自己去确认,追踪一下好了。
    接分~~~~谢啦。