2010-05-25 2 views
2

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

Даже с TerminateProcess вызвал его?

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

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

ответ

3

No. TerminateProcess делает именно это - полностью разрушает процесс. Raymond Chen имеет несколько слов, чтобы сказать о том, что ....

EDIT: Кроме того, он имеет некоторые more detailed articlesс подробным описанием именно, как происходит закрытие процесса. Однако он не связан с TerminateProcess.

2

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

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

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

+0

1: Но COM-сервер вне процесса будет умирать, если на него вызывается 'TerminateProcess', независимо от того, что у процессов все еще есть ссылки. 2: +1 для комментария «отредактируйте свой вопрос». –

+0

COM-сервер не будет работать вечно, если клиент умрет. Он будет отключен после определенного тайм-аута. –

Смежные вопросы