COM Указатели и завершение процесса - PullRequest
2 голосов
/ 26 мая 2010

Может ли невыпущенный указатель COM на внешний процесс (все еще работающий) привести к зависанию этого процесса при уничтожении?

Даже при вызове TerminateProcess?

Процесс A имеет ссылку на указатель интерфейса COM на процесс B, теперь процесс B выдает TerminateProcess для A, если какой-либо указатель интерфейса COM на процесс B в процессе A не был выпущен должным образом, может ли процесс зависать при завершении?

Я хочу знать, так как у меня есть проект, в котором дочерний процесс зависает при уничтожении, даже если TerminateProcess вызывается в случае сбоя обычной процедуры закрытия. Когда он зависает от убийства, он не только сам, но и родительский процесс, что губительно, поскольку он работает в производственной среде. Поэтому я пытаюсь понять, где есть вероятность, что все пойдет не так.

Ответы [ 2 ]

3 голосов
/ 26 мая 2010

Нет. TerminateProcess делает именно это - полностью уничтожает процесс. Раймонд Чен есть несколько слов, чтобы сказать об этом ....

РЕДАКТИРОВАТЬ: У него также есть более подробные статьи подробно точно , как происходит останов процесса. Однако это не относится к TerminateProcess.

2 голосов
/ 26 мая 2010

Ну да, технически возможно, что TerminateProcess не завершает процесс. Если есть поток ядра, выполняющий запрос ввода-вывода, который никогда не заканчивается, процесс не может завершиться. Легко диагностировать, вы увидите процесс на вкладке «Процессы» Taskmgr.exe со счетчиком единиц. В Vista было исправление CancelIo, чтобы исправить это, я думаю, Рэймонд тоже об этом говорил.

Который только очень отдаленно связан с COM. Понимание: солидный COM-сервер не обрабатывает TerminateProcess клиента, Windows не может автоматически вызывать Release () для указателей интерфейса. Это будет продолжаться вечно. Пока кто-нибудь не вызовет TerminateProcess, обычно это код завершения работы Windows или TaskMgr.exe

Обязательно отредактируйте свой вопрос и объясните, почему вы его даже задали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...