CoInitialize失败

时间:2010-02-05 20:01:13

标签: c++ windows com

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

3 个答案:

答案 0 :(得分:1)

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

更为模糊的解释是内核内存池中的空间不足。也可以从“性能”选项卡中的Taskmgr中看到。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

你有没有机会在DLL_THREAD_ATTACH上从DllMain拨打CoInitialize了?这很可能会导致死锁或导致泄密。

我认为在Thread Local Storage

索引附近发生了内存泄漏