简体   繁体   中英

Get Thread exit code after running ShellExecuteEx

How can the exit code of the main thread be retrieved, after having run ShellExecuteEx() in asychronous mode?

The process exit code can simply be retrieved as follows:

SHELLEXECUTEINFO execInfo;
execInfo.cbSize = sizeof(SHELLEXECUTEINFO);
execInfo.fMask = SEE_MASK_NOASYNC;

ShellExecuteEx(&execInfo);

/* Get process exit code. */
DWORD processExitCode;
GetExitCodeProcess(execInfo.hProcess, &processExitCode);

But how can the exit code of the main thread be retrieved? What should be passed to GetExitCodeThread()?

主线程的退出代码等于进程IMHO的退出代码。

In order to get the exit code of the primary process thread - one has to obtain its HANDLE . Unfortunately ShellExecuteEx doesn't return you this (it returns only the HANDLE of the newly created process).

One could also enumerate all the threads in a particular process and open their handles ( OpenThread ). Thus, you could create a process in a "suspended" state, get the handle of its only thread (which didn't start execution yet), and then go on.

Alas, ShellExecuteEx neither allows you to create a new process in a suspended state.

So that I don't see a clean way to achieve what you want. I'd suggest the following:

  1. Why would you want the exit code of the primary thread anyway? Perhaps the exit code of the process will be enough?
  2. Consider using CreateProcess . It has the needed functionality.
  3. Some dirty tricks may help, like injecting DLLs into the newly created process (hooking) and etc.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM