Есть Лаунчер. Он стартует некое приложение и скрывается из виду. Нужно как только дочерний процесс завершиться показать лаунчер снова.
Пока делаю так в Лаунчере:
0. ::ShowWindow(parentHwnd, SW_HIDE);
1. RunProcess(path, args);
2.
RepeatOnTimeout([parentHwnd]()->bool {
//работает в отдельном потоке
if (CheckProcessExists(L"child.exe"))
{
return true;
}
//if ended
::ShowWindow(parentHwnd, SW_SHOW);
return false;
}, 1000);
Как можно это сделать более правильно?
RunProcess такой:
void RunProcess(const wstring &path, const wstring &args)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE g_hChildStd_OUT_Rd = NULL;
HANDLE g_hChildStd_OUT_Wr = NULL;
SECURITY_ATTRIBUTES saAttr;
ZeroMemory(&saAttr, sizeof(SECURITY_ATTRIBUTES));
memset(&saAttr, 0, sizeof(SECURITY_ATTRIBUTES));
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
//saAttr.bInheritHandle = TRUE;
//saAttr.lpSecurityDescriptor = NULL;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
//si.hStdError = g_hChildStd_OUT_Wr;
//si.hStdOutput = g_hChildStd_OUT_Wr;
//si.dwFlags |= STARTF_USESTDHANDLES;
wstring cmdLine = WStrF(L"\"%s\" %s", path.c_str(), args.c_str());
WCHAR buff[4096];
wcscpy(buff, cmdLine.c_str());
BOOL ret = CreateProcess(NULL, buff,
NULL,
NULL,
TRUE,
NULL,
NULL,
NULL,
&si,
&pi);
if (!ret)
{
throw exception("Failed to run process");
}
}