Содержание материала

 

Создали? Если нет - то дальше ловить нечего, поэтому генерим 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)

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить