如何解决 CoUnitialize() 上挂起的进程?

2024-03-21

我有一个本机 Visual C++ NT 服务。当服务启动时,它的线程调用CoInitialize()它将线程附加到 STA - 服务线程通过 COM 接口使用 MSXML。

当服务接收到SERVICE_CONTROL_STOP它在消息队列中发布一条消息,然后检索该消息并OnStop()处理程序被调用。处理程序清理东西并调用CoUnitialize()。大多数时候它工作正常,但有时后一个调用会挂起。我无法稳定地重现这种行为。

我用谷歌搜索了一段时间,发现了以下可能的解释:

  1. 无法释放拥有的所有 COM 对象
  2. 反复呼唤CoInitializeEx()/CoUnitialize()用于连接到 MTA http://support.microsoft.com/kb/293278
  3. 无法在 STA 线程中分派消息 http://support.microsoft.com/default.aspx?scid=kb;en-us;136885

第一个不太可能 - 使用 MSXML 的代码经过了充分的测试和分析,并且它使用智能指针来控制对象的生存期,因此泄漏对象确实不太可能。

第二个看起来不像是可能的原因。我附加到 STA 并且不会重复调用这些函数。

第三种可能性看起来或多或少是有可能的。当线程处理消息时,它不再运行消息循环 - 它已经在循环内。我想这可能是原因。

后者是这个问题的可能原因吗?我还应该考虑哪些其他原因?我如何轻松解决这个问题?


不要这样做anything在处理 SCM 消息的线程中,它处于一个奇怪的神奇上下文中 - 您必须尽快答复 SCM 的请求,而不采取任何阻塞操作。通过 STOP_PENDING 告诉它您需要额外的时间,将另一个线程排队以进行真正的清理,然后立即完成 SCM 消息。

至于 CoUninitialize,只需附加 WinDbg 并转储所有线程 - 死锁很容易诊断(也许无法修复!),您已经在堆栈中找到了所有犯罪方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决 CoUnitialize() 上挂起的进程? 的相关文章

  • 资源文件是否编译为 UNICODE 或 ANSI 代码页?

    首先 如果这个问题已经被回答了一百次了 我深表歉意 噢 但我的搜索显然很糟糕 因为我没有运气回答这个基本问题 EXE DLL中的资源是如何存储的 作为 UNICODE UCS 2 Windows 本机内部字符格式 还是使用资源块的代码页作为
  • 在 Windows 7 中使用 Windows 服务截取屏幕截图 [重复]

    这个问题在这里已经有答案了 我知道这是一个关于 Win 7 中的屏幕截图与 c 上的 winService 的老问题 我已经阅读了 Stack Overflow 上有关此内容的所有文章以及 CodeProject 上的很多文章 我了解服务的
  • 调整大小时在窗口中绘图留下未绘制的边框

    我遇到的问题看似微不足道 但我找不到解决的方法 这里是 我有一个窗口 里面有一些图形 为了简单起见 我们假设它是一个实心绿色矩形 填充了窗口的整个客户区域 我希望每次窗口改变大小时都重新绘制这个矩形并填充整个窗口 我最初做的就是这样的 我已
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • 提取证书中主题属性的所有值

    我目前正在使用CertGetNameString http msdn microsoft com en us library windows desktop aa376086 28v vs 85 29 aspx提取每个主题属性的值 如下所示
  • 无法启动 Windows 服务,错误 1064

    我编写了一个在 Win10 上运行的 Windows 服务 它运行得非常好 直到我决定对其进行一些更改 我重写了一些逻辑 在调试和发布配置中进行了测试 一切都很好 然后 我使用卸载了当前版本的服务installutil exe u serv
  • 设置窗口像素的正确(且无闪烁)方法?

    我正在努力找出在 WM PAINT 期间将纯 RGBA 值数组转储到 Win32 窗口的客户区的正确方法 我有以下代码 但它看起来已经很复杂 我什至还没有完成 case WM ERASEBKGND return 1 case WM PAIN
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • MongoDB 3.0 Windows 服务启动:发生系统错误 2

    我已经下载了 MongoDB Windows msi 安装并成功运行 mongod exe 和 mongo exe 命令文件执行工作正常 安装手册展示了如何创建配置文件 然后使用命令创建Windows Server sc exe creat
  • 在 Windows 7 上的 Sourcetree 中比较 Word docx 文件

    我一直在尝试获取在 Windows 7 上的 Sourcetree 中工作的 Word docx 文件的文本差异 我已按照此处的说明进行操作将 Microsoft Word 与 git 结合使用 http blog martinfenner
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将
  • 在 Windows 服务和 Azure WebJob 之间利用单一代码库的方法

    我正在开发一个定时重复流程 在某些情况下将部署在本地 而在其他情况下将部署在云 Azure 中 我正在研究 Windows 服务和 Azure WebJob 鉴于我只需要重复过程作为定时部分 我正在考虑将大量逻辑放在一个库中 只是本地部署的
  • C++ 使用 Windows 命名管道

    由于某种原因 桅杆和从属装置都失败了 但是我可以找到任何关于它们如何工作的好例子 所以我不确定我哪里出了问题 在 ConnectNamedPipe 之后 主设备永远不会退出 WaitForSingleObject 并且从设备在第一个 boo
  • 如何在不创建安装程序的情况下安装 C# Windows 服务?

    有谁知道是否有一种方法可以安装用 C 创建的 Windows 服务而无需制作安装程序 我包括一个为我进行安装的课程 我使用命令行参数调用应用程序来安装或卸载应用程序 我过去还向用户提示是否要在直接从命令行启动时安装该服务 这是我使用的类 u
  • 可以读取目标文件吗?

    我很好奇 obj文件 我几乎不知道它们是什么 或者它们包含什么 所以我用 Vim 文本编辑器打开它们 我在里面发现了一种类似外星人的语言 有什么办法可以理解它们代表什么以及它们的内容是什么 另外 它们的用途是什么 Thanks Sure 但
  • 如何使用 Win32 API 与 com 端口 (RS232) 通信

    我正在尝试使用 win32 API 与 com 端口对话 我找到了这个http www robbayer com files serial win pdf http www robbayer com files serial win pdf
  • 如何查找给定接口 GUID 的 COM 接口定义?

    我有一个 COM 接口 GUID 但我不知道该接口定义 我不知道它有什么方法 有什么参数等等 我怎样才能获得这些信息 一般情况下可以吗 实际问题是获取 中定义的少数 COM 接口的接口定义actxprxy dll 例如IFileDialog
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 通过win32检测多个登录用户

    使用标准 win32 api 检测多个用户登录的最佳方法是什么 我对我们的软件产品进行了升级 当多个用户登录时 该产品无法运行 我知道这是应该避免的事情 因为它很烦人 但该产品非常复杂 您必须相信我 当我说确实没有其他解决方案时 谢谢 为了

随机推荐

  • Python 和 websockets - 发送音频流

    我已经设置了一个套接字服务器并将消息发送到所有连接的客户端 我正在将数据从 python 发送到 javascript 我想将我的麦克风输入发送给所有正在收听的客户 所以在我的 Python 应用程序中我执行以下操作 import pyau
  • (有效)合并随机键控子集

    我有两个data tables 我想从匹配键的元素中随机将一个元素分配给另一个元素 我现在这样做的方式非常慢 让我们具体说一下 这是一些示例数据 dt1 lt data table id sample letters 1 5 500 rep
  • pandas DataFrame 多列的并排箱线图

    一年的样本数据 import pandas as pd import numpy random as rnd import seaborn as sns n 365 df pd DataFrame data A rnd randn n B
  • Chrome 开发者控制台问题

    我正在尝试测试我的网站上产生随机整数的功能 我想知道是否可以使用 chrome 开发者控制台通过代码触发按钮事件 而无需实际按下页面上的按钮 是否可以发送与用户输入文本框中的值不同的值 假设用户将他的名字输入 Tom 有没有办法通过控制台中
  • 尝试注册两个同名的ProgressBarAndroid视图

    将react版本16 0 0与react native版本0 49 1一起使用会引发红屏错误 尝试注册两个具有相同名称的ProgressBarAndroid视图 删除 ProgressBarAndroid 的所有导入和实例会产生运行良好的程
  • scikit learn:未选择所需数量的最佳功能 (k)

    我试图使用卡方 scikit learn 0 10 选择最佳特征 我首先从总共 80 个训练文档中提取 227 个特征 然后从这 227 个特征中选择前 10 个特征 my vectorizer CountVectorizer analyz
  • Hibernate 的泛型

    Hibernate 无法加载以下类 package com project alice entities import javax persistence Entity import javax persistence GeneratedV
  • 设置对话框的最大高度,然后允许滚动

    我似乎无法理解如何正确设置 jquery ui 对话框的高度 我希望它显示存在的内容的高度 但如果它超过 400 像素 那么我需要一个滚动条 因此 如果内容的高度为 200 像素 则对话框的高度应为 200 像素 如果内容的高度大于 400
  • graphviz 中跨越多行的记录

    我试图用点语言可视化一个相当复杂的结构 因为记录很大 所以我想把代码写成多行 所以而不是 A11 label A 11 Access Control A 11 1 Business requirements for access contr
  • Bash 变量替换和字符串

    假设我有两个变量 a AAA b BBB 我从文件中读取了一个字符串 该字符串如下 str a b 如何从替换变量的第一个字符串创建一个新字符串 newstr AAA BBB bash questions tagged bash多变的间接没
  • 使用 libtorrent-python 下载 Torrent

    我有以下 python 代码 import libtorrent as lt import time ses lt session ses listen on 6881 6891 params save path home download
  • iOS 15 TabView导航栏透明度问题

    新的 iOS 15 使导航栏背景完全透明 如果后面没有元素 如果有一个列表并且您将元素滚动到导航栏后面 这将获得白色半透明背景 但如果我使用 TabView 其中每个 TabItem 都有一个在选项卡项目之间切换时 导航栏背景内的列表未正确
  • 如何在bash中找到字符串中最后分组的数字

    这是一个后续问题this https stackoverflow com q 51923800 10247894问题 关于如何知道字符串中分组数字的数量 In bash 如何找到字符串中最后一次出现的一组数字 所以 如果我有 string
  • Xamarin 表单(跨平台):ListView 中的多种类型的单元格

    I am new to Xamarin I have a requirement where I have to implement a ListView or say tableView that have multiple differ
  • TortoiseGit 使用不正确的 SSH 密钥

    我现在有一个关于乌龟git的奇怪问题 我无法弄清楚 当尝试提交到 github 上的存储库时 出现错误 错误 对 key2 的 martindevans Hermes git 权限被拒绝 Key2 是我用来访问不同 github 存储库的密
  • 我可以一成不变地借用 self 来实现 self.callbacks: Vec> 吗?

    pub struct Notifier lt a T gt callbacks Vec
  • 如果启用了热模块替换,为什么在更改 HTML 时 LiveReload 在 Webpack 中不起作用?

    如果你设置hot true in the devServer设置在Webpack 那么模块热更换CSS 有效 并且无需重新加载完整页面即可应用更改 但是当改变HTML文件时 实时重载由于某种原因不起作用 您需要手动刷新页面才能应用更改 If
  • 'Object.ReferenceEquals' 始终为 false,因为它是使用值类型调用的

    当我使用slSvcUtil exe要创建我的服务客户端文件 我看到如下代码 private string CategoryField System Runtime Serialization DataMemberAttribute publ
  • 如何使用 Python 中的 DLL 文件?

    最简单的使用方法是什么DLL从内部归档Python 具体来说 如何做到这一点without编写任何附加包装器C 向其公开功能的代码Python Native Python与使用第三方库相比 功能更受青睐 为了方便使用 ctypes http
  • 如何解决 CoUnitialize() 上挂起的进程?

    我有一个本机 Visual C NT 服务 当服务启动时 它的线程调用CoInitialize 它将线程附加到 STA 服务线程通过 COM 接口使用 MSXML 当服务接收到SERVICE CONTROL STOP它在消息队列中发布一条消