Написал программу, которая последовательно запускает 3 другие программы, все работает, но я не уверен что все грамотно написано, так как не знаю как что работает), должен ли я прописывать CloseHandle после каждого запуска процесса или только в конце программы, хочу услышать ваши замечания, вот пример кода:
int cn = 30;
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
string path;
string path1;
string path2;
ifstream fin;
ofstream check;
// Запускаю первую программу и жду ее завершения
path1 = "\"C:\\Users\\Acer\\YandexDisk\\latest version\\StBuilderMul\\Debug\\StBuilderMul.exe\"";
path2 = "C:\\Users\\Acer\\Desktop\\Monday\\case";
path = path1 + " " + path2 + " " + to_string(cn);
CreateProcess(NULL, const_cast<LPSTR>(path.c_str()), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
// Запускаю вторую программу и жду ее завершения
path1 = "\"C:\\Users\\Acer\\YandexDisk\\latest version\\Stochastic\\Debug\\Stochastic.exe\"";
path2 = "C:\\Users\\Acer\\Desktop\\Monday\\case";
path = path1 + " " + path2 + " " + to_string(cn);
CreateProcess(NULL, const_cast<LPSTR>(path.c_str()), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
// Запускаю третью программу и жду ее завершения
path1 = "\"C:\\Users\\Acer\\YandexDisk\\latest version\\CF Distribution\\Debug\\CF Distribution.exe\"";
path2 = "C:\\Users\\Acer\\Desktop\\Monday\\case";
path = path1 + " " + path2 + " " + to_string(cn);
CreateProcess(NULL, const_cast<LPSTR>(path.c_str()), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
// Закрываю дискрипоры процесса и потока
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
system("pause");
return 0;
Исходя из всего сказанного, правильный код будет выглядеть так
if (!CreateProcess(NULL, const_cast<LPSTR>(path.c_str()), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
// Ошибка. Процесс не запустился. Закрывать нечего. Код ошибки вернет GetLastError
} else {
// Дескриптор потока нам не нужен
CloseHandle(pi.hThread);
// Ждем завершения процесса
WaitForSingleObject(pi.hProcess, INFINITE);
// Дескриптор процесса уже не нужен
CloseHandle(pi.hProcess);
}
// Запускаем следующий процесс
if (!CreateProcess(NULL, const_cast<LPSTR>(path.c_str()), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
// Ошибка. Процесс не запустился. Закрывать нечего. Код ошибки вернет GetLastError
} else {
// Дескриптор потока нам не нужен
CloseHandle(pi.hThread);
// Ждем завершения процесса
WaitForSingleObject(pi.hProcess, INFINITE);
// Дескриптор процесса уже не нужен
CloseHandle(pi.hProcess);
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости