【问题标题】:CoInitialize Failed初始化失败
【发布时间】:2010-02-06 10:33:05
【问题描述】:

我们有多线程应用程序。每个线程在初始化时都必须使用 CoIntialize 调用,因为我们使用一些 C++ COM 对象进行 DB 操作。该应用程序在生产环境中可以正常工作更长的时间。但突然线程初始化函数中的 CoIntialize() API 失败并出现以下错误 线程初始化; HRESULT:80070008:没有足够的存储空间来处理此命令。 操作系统:带有 SP2 的 Windows Server 2003 R2。我在stackoverflow中找到了工作 在 Windows 注册表中将控制台应用程序的堆大小从 512 KB 增加到 1MB。我能做到。但我想知道首先发生这种情况的可能原因是什么。环境最近没有改变。该机器上运行着其他几个进程,它们可以毫无问题地调用 Coinitialize。它仅失败了两个过程。提前致谢

【问题讨论】:

  • 你使用了多少线程?
  • 它是一个变量计数。它可能介于 7 到 64 之间。当问题发生时,我没有看到超过 10 个线程正在运行。谢谢

标签: c++ windows com


【解决方案1】:

CoInitialize“在当前线程初始化COM库”,确实有内存需求。

我的猜测是您的生产环境遇到了应用程序的堆大小不足以在新线程上初始化 COM 的点。也许您遇到了分配的线程比以前更多的情况,即使应用程序运行的时间没有那么长。

提高堆大小可以解决这个问题,因为它可以让这些线程正确初始化。

【讨论】:

  • 谢谢您,我正在等待客户对 dheamon 总结报告的反馈。这将有助于解决任何堆大小问题
  • 我提供了增加堆的选项,它运行了几天。我没有再次报告同样的问题。谢谢
【解决方案2】:

某处有东西泄漏。首先假设它是您的程序。您可以使用 Taskmgr.exe、进程选项卡、查看 + 选择列并勾选句柄、GDI 对象和 USER 对象来观察其句柄使用情况。在您的应用程序运行时观察这些数字。如果它们稳步攀升,那么您的代码中的句柄就会泄漏。一旦一栏达到10,000,节目就结束了。

一个更模糊的解释是内核内存池中的空间不足。在“性能”选项卡中的 Taskmgr 中也可见。

【讨论】:

    【解决方案3】:

    您是否有机会在 DLL_THREAD_ATTACH 上从 DllMain 调用 CoInitialize?这很可能会导致死锁或导致泄漏。

    我想在Thread Local Storage 的索引附近发生了内存泄漏

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 2012-11-17
      • 2017-12-10
      • 2018-09-17
      • 1970-01-01
      • 2018-10-13
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多