Как использовать CloseHandle

267
08 февраля 2018, 17:24

Написал программу, которая последовательно запускает 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;
Answer 1
  1. Хэндлы закрываются тогда, когда в них пропадает необходимость
  2. Закрытие хэндлов процессов и потоков не приводит к завершению этих процессов и потоков
  3. Использование структуры как out параметра приводит к перезаписыванию полей структуры и потере предыдущих значений.

Исходя из всего сказанного, правильный код будет выглядеть так

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);
}
READ ALSO
C++ проэкт, VS-2017, почему не находится хеадер

C++ проэкт, VS-2017, почему не находится хеадер

Знаю дуракций вопрос но может всё же поможетехеадер table

232
Внутренности сопрограмм с++

Внутренности сопрограмм с++

Пытаюсь понять работу сопрограмм в с++17Что это такое и по что оно нужно - более-менее понятно из ответа к вопросу Сопрограммы в С++

188
Реализовать функцию объединения двух wav mono файлов в один wav stereo файл

Реализовать функцию объединения двух wav mono файлов в один wav stereo файл

Задание:"Реализовать функцию объединения двух mono файлов в один stereo файл, где первый файл является левым каналом, а второй правым каналом выходного...

249
Поиска в бинарном файле по маске

Поиска в бинарном файле по маске

Есть бинарный файлВ нём нужно найти последовательности байтов по маске:

218