我想运行起一个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和任务管理器里面的一样。问一个问题,区别在哪儿?为什么有这样的区别。
第一种运行方式:
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和任务管理器里面的一样。问一个问题,区别在哪儿?为什么有这样的区别。
你可以Sleep几秒后再GetProcessId试试
我在调用ShellExecuteEx之后,Sleep几秒钟,再次去获取ProcessID,还是能获取到,不知道为什么。
我自己去确认,追踪一下好了。
接分~~~~谢啦。