C++ COM函数生成不会消失的线程

C++ COM函数生成不会消失的线程,c++,c,windows,multithreading,com,C++,C,Windows,Multithreading,Com,我正在开发一个小应用程序,该应用程序旨在调用一些(真正多样化的)函数,这些函数不幸地超出了我的控制范围,并且设计的方式使我不知道何时完成了正确的用户操作。特别是其中一些会产生一个线程来完成它们的工作,最终会在将来的某个时候消亡。所以有些是同步实现的,有些是异步实现的,我的代码不知道它将是哪一个 我的应用程序的唯一目的是启动这些任务并在完成后终止。由于其目的是自动化,我预计它会在瞬间从批处理文件调用100次,因此我不希望该过程停留在绝对可能的时间之外 由于我没有可以等待的信号,因此主线程上的Exi

我正在开发一个小应用程序,该应用程序旨在调用一些(真正多样化的)函数,这些函数不幸地超出了我的控制范围,并且设计的方式使我不知道何时完成了正确的用户操作。特别是其中一些会产生一个线程来完成它们的工作,最终会在将来的某个时候消亡。所以有些是同步实现的,有些是异步实现的,我的代码不知道它将是哪一个

我的应用程序的唯一目的是启动这些任务并在完成后终止。由于其目的是自动化,我预计它会在瞬间从批处理文件调用100次,因此我不希望该过程停留在绝对可能的时间之外

由于我没有可以等待的信号,因此主线程上的
ExitThread()
似乎是一条出路,因此由外部代码生成的任何线程在终止时都会终止进程

现在来谈谈我在标题中提到的实际问题。:)为了获得适合我的jig的接口,我需要处理一些COM函数
SHParseDisplayName
IShellFolder::GetUIObjectOf
和其他一些。但在我完成这些接口并发布它们很久之后,这些线程仍然存在。甚至在我调用了
coninitialize()
之后

当使用process Explorer检查我的进程时,这些线程中的大多数似乎都有
ntdll。dll@EtwTraceMessageVa
作为入口点,并卡在
ntdll.dll中!ZwAlpcSendWaitReceivePort+0xa
。显然,这里不允许使用
TerminateThread
随机终止线程


当我使用完COM后,如何让它终止这些线程?我正在使用W7 x64进行开发。

这些线程不属于COM。它们属于本机Windows线程池。它们被设计成可以粘在周围,以便在必要时可以重复使用。假设没有挂起的异步回调,您应该能够完全关闭。线程池将负责及时销毁线程。

我发现了问题所在,很明显,所有文档都在某个地方,而不是您正在查找的地方,一个相关主题对此问题进行了讨论,这让我找到了缺失的部分

我的应用程序弹出一个文件的
IContextMenu
(因此在我的代码中没有
ShellExecute
),然后允许调用命令。然而,像
properties
这样的动词是我的问题所涉及的奇怪问题:它们产生了另一个线程,并且没有给出通知或明显的方式来阻止它


使用链接帖子中提到的SHSetExplorerInstance修复了我的问题。:)

奇怪,没有收到你回复的通知。不管怎样,我的“主”线程已经死了,它有意产生的线程已经死了,但是我留下了一个死进程,其中有一堆我无法影响的线程。恐怕我看不到它们被破坏的任何痕迹。您可能有一个COM接口引用计数错误或其他一些保留资源的东西。无论哪种方式,如果您使用的是C运行时,它都应该在主线程从main或wWinMain返回后终止进程(不管其他线程可能正在运行)。它通过调用exit函数来实现这一点。如果你不使用C运行时,那么你可以调用ExitProcess函数来达到同样的目的。我知道这一切。你看过问题了吗?它确切地说明了为什么我不能依赖ExitProcess,如果可能的话,我想切换到ExitThread()关于参考计数。。我一步一步地浏览了代码,一直在关注那些麻烦的线程是什么时候创建的,但是这些命令中涉及的接口在几行之后就发布了。如果我没有仔细阅读你的问题,我很抱歉。我只是想帮忙。无论如何,这些线程都是由本机线程池创建的。除非你自己创建池,否则你无法直接关闭它。谢谢你的努力。我只是重新读了一遍,意识到我可能有点粗鲁,这不是我的本意。:)