ADsOpenObject()返回-2147024882(0x8007000E) - >内存不足

时间:2013-12-06 09:00:59

标签: c++ active-directory out-of-memory adsi

我有一个C ++ DLL,用于每次登录时由Windows服务加载的身份验证。

在该DLL中,我使用Windows ADSI函数ADsOpenObject() Active Directory 获取用户对象。

HRESULT hr = ADsOpenObject(L"LDAP://rootDSE",
                           L"username",
                           L"password",
                           m_dwADSFlags,
                           IID_IDirectorySearch,
                           (void**)&m_DSSearch);

一般来说这可以使用多年。但目前我收到错误代码

  

-2147024882(0x8007000E)

OUT_OF_MEMORY。当我重新启动使用我的DLL的服务时,它运行良好数周,但随后错误开始发生。

现在我找不到 内存不足的内容。任务调度程序看起来很好,可用内存很充足 我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:4)

  

这是OUT_OF_MEMORY。

是E_OUTOFMEMORY,一个COM错误代码。描述不是很有用,这个错误代码往往是由Microsoft代码而不仅仅是内存返回任何“out of resources”错误。可以达到内部限制,可能是失败的winapi调用。

并不一定限于所涉及的直接软件。例如,泄漏内核池内存的错误设备驱动程序可能是事故的间接来源。

如果您可以在应用程序事件日志中找到某些内容,那么您将会很幸运,同时查看报告错误的计算机以及域服务器。任务管理器可能会提供线索,添加句柄,GDI对象,USER对象,提交大小,页面池和NP池列。很难提出超出此范围的具体建议。毫无疑问,当你不得不定期重新启动机器进行恢复时,它就像一个漏洞一样嘎嘎作响。祝你好运。

答案 1 :(得分:2)

您是否在m_DSSearch上调用Release?此外,如果您正在搜索,您需要调用CloseSearchHandle或AbandonSearch。如果你没有做其中任何一个,你可能会慢慢泄漏记忆。

答案 2 :(得分:0)

您的进程可能会将堆碎片化到一定程度,以便ADsOpenObject无法找到足够大的连续内存。

您可以使用VMMap来分析您的内存使用情况: http://technet.microsoft.com/en-us/sysinternals/dd535533

您可以尝试启用低碎片堆: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v=vs.85).aspx

答案 3 :(得分:-1)

如果它现在开始出现并且它不是更早,我会想到两种可能性之一:它与时间有关(更具体地说是年份,某种千年虫)。另一种选择是32/64位架构的问题。

现在请注意,我不编写C ++程序。但我确实对MS错误有所了解(我曾在MS帮助台工作过......)