COM指针和进程终止

时间:2010-05-25 21:31:13

标签: c++ com pointers resources

未发布的指向外部进程(仍处于活动状态)的COM指针是否会导致该进程在销毁时挂起?

即使调用了TerminateProcess吗?

进程A有一个COM接口指针引用进程B,现在进程B在A上发出一个TerminateProcess,如果进程A中进程B的某些COM接口指针未正确释放,那么进程是否会在终止时挂起?

我想知道,因为我有一个子进程挂起的项目,即使正常关闭过程失败也会调用TerminateProcess。当它挂起时,它不仅会自行挂起,而且它也是它的父进程,因为它在生产环境中运行,所以它是灾难性的。所以我试图看看哪里有可能出错。

2 个答案:

答案 0 :(得分:3)

没有。 TerminateProcess就是这样 - 完全破坏了这个过程。 Raymond Chen对此有几句话要说....

编辑:他还有一些more detailed articles详细说明完全进程关闭的方式。但它与TerminateProcess无关。

答案 1 :(得分:2)

嗯,是的,TerminateProcess技术上可以不终止进程。如果存在执行永不结束的I / O请求的内核线程,则该进程无法退出。易于诊断,您将在Taskmgr.exe的进程选项卡中看到进程计数为1的进程。 Vista有一个CancelIo改进来解决这个问题,我认为Raymond也谈到了这一点。

这与COM非常相关。抓住吸管:进程外的COM服务器不能很好地处理客户端的TerminateProcess,Windows无法在接口指针上自动调用Release()。它将永远运行。直到有人调用TerminateProcess,通常是Windows关闭代码或TaskMgr.exe

确保编辑您的问题并解释您甚至提出问题的原因。