Как часто повторно используются дескрипторы процессов

Я замечаю дескриптор приложения, когда использую функцию оболочки для его открытия. Затем я использую этот дескриптор, чтобы позже закрыть приложение. Однако пользователь также может сам закрыть это другое приложение. Может ли этот дескриптор повторно использоваться окнами, чтобы при использовании этого дескриптора я закрывал другой процесс. Если это возможно, то это вероятно?


person jjb    schedule 29.11.2009    source источник


Ответы (2)


Нет, тебе не о чем беспокоиться. Дескриптор, возвращаемый, скажем, OpenProcess, ShellExecuteEx() или CreateProcess, сохраняет объект процесса живым. Вот как можно вызвать GetExitCodeProcess() для получения кода выхода после завершения процесса.

Объект не освобождается до тех пор, пока последний дескриптор на нем не будет закрыт. Вопреки более ранним советам, данным в этой теме, очень важно, чтобы вы вызывали CloseHandle(), иначе у вас будет утечка.

person Hans Passant    schedule 29.11.2009
comment
Спасибо, но я не совсем понимаю. Утечка памяти здесь из-за того, что closehandle() не вызывается. Будет ли это прояснено после того, как приложение, выполнившее вызов оболочки, будет правильно закрыто? - person jjb; 29.11.2009
comment
Да, Windows очищает дескрипторы, которые не были закрыты. Не позволяйте этому зайти так далеко. - person Hans Passant; 29.11.2009
comment
не просто вызвать sendmessage Call SendMessage(intHandle, const_CLOSE, 0&, 0&) и закрыть приложение, и выполнить работу closehandle() одновременно? - person jjb; 29.11.2009

Вы можете дождаться дескриптора процесса, чтобы выяснить, когда он вышел.

WaitForSingleObject(hProcess, INFINITE);

Как только это вернется, вы знаете, что процесс завершился, и вам не нужно его закрывать.

person Roland Rabien    schedule 29.11.2009
comment
Нет, вызов CloseHandle() необходим, чтобы избежать утечки. - person Hans Passant; 29.11.2009
comment
спасибо за это, но похоже, что дескриптор не будет использоваться повторно, потому что он остается открытым, пока приложение, выполнившее команду оболочки, не закроет его. - person jjb; 29.11.2009