views:

50

answers:

2

Can an unreleased COM pointer to an external process (still alive) cause that process to hang on destruction?

Even with TerminateProcess called on it?

Process A has a COM interface pointer reference to Process B, now Process B issues a TerminateProcess on A, if some COM interface pointer to Process B in Process A is not released properly, could it be that the process hangs on termination?

I want to know as I have a project where a child process hangs on killing, even though TerminateProcess is called if the normal close procedure fails. When it hangs on killing, it doesn't just hang itself, but also it's parent process, which is disastrous since this is running in a production environment. So I'm trying to see where there's possibilities of it going wrong.

+3  A: 

No. TerminateProcess does just that -- completely destroys the process. Raymond Chen has a few words to say about that....

EDIT: He also has some more detailed articles detailing exactly how process shutdown occurs. It however is not related to TerminateProcess.

Billy ONeal
+2  A: 

Well, yes, it is technically possible for TerminateProcess not to terminate the process. If there's a kernel thread executing an I/O request that never ends then the process cannot exit. Easy to diagnose, you'll see the process in Taskmgr.exe's Processes tab with a handle count of one. Vista had a CancelIo improvement to fix this, I think Raymond talked about that too.

Which is only very remotely associated with COM. Grasping at straws: an out-of-process COM server doesn't deal with TerminateProcess of a client well, Windows cannot automatically call Release() on the interface pointers. It will keep running forever. Until somebody calls TerminateProcess, usually the Windows shutdown code or TaskMgr.exe

Do make sure to edit your question and explain why you even asked it.

Hans Passant
1: But the out-of-process COM server will die if `TerminateProcess` is called on it, no matter that processes still have references open. 2: +1 for the "edit your question" comment.
Billy ONeal
COM-server won't be running forever if a client dies. It will be shut down after a specific timeout.
Sergius