Создали? Если нет - то дальше ловить нечего, поэтому генерим Exception'ы...
Есть еще одна тонкость. У нас Все созданные хэндлы наследуемые! А дочернему процессу понадобятся только два... Поэтому:
Code: |
// Делаем НЕ наследуемые дубликаты // Это нужно, чтобы не тащить лишние хэндлы в дочерний процесс... if not DuplicateHandle(GetCurrentProcess(), FChildStdoutRd, GetCurrentProcess(), @Tmp1, 0, False, DUPLICATE_SAME_ACCESS) then raise EDuplicateHandleErr.CreateRes(@sDuplicateHandleMsg) else if not DuplicateHandle(GetCurrentProcess(), FChildStdinWr, GetCurrentProcess(), @Tmp2, 0, False, DUPLICATE_SAME_ACCESS) then raise EDuplicateHandleErr.CreateRes(@sDuplicateHandleMsg) |
Дубликаты у нас в Tmp1 и Tmp2, теперь:
Code: |
CloseHandle(FChildStdoutRd); //Закроем наследуемый вариант "Читального" хэндла CloseHandle(FChildStdinWr); //Закроем наследуемый вариант "Писального" хэндла FChildStdoutRd := Tmp1; //И воткнем их места НЕ наследуемые дубликаты FChildStdinWr := Tmp2; //И воткнем их места НЕ наследуемые дубликаты |
Ура! Теперь можем создавать дочерний процесс!
Code: |
if not CreateChildProcess(ExeName, CommadLine, FChildStdinRd, FChildStdoutWr) then // Наконец-то! Создаем дочерний процесс! raise ECreateChildProcessErr.CreateRes(@sCreateChildProcessMsg) |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!