ADsOpenObject() возвращает -2147024882 (0x8007000E) → OUT_OF_MEMORY

У меня есть С++ DLL, которая используется для аутентификации, которая загружается службой Windows для каждого входа.

В этой DLL я использую функцию ADSI Windows 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, она работает отлично в течение нескольких недель, но затем начинают происходить ошибки.

Теперь я не могу найти , что не хватает памяти. Планировщик задач выглядит отлично, а свободной памяти много.
Что я могу сделать, чтобы исправить это?

Ответ 1

который является OUT_OF_MEMORY.

Это E_OUTOFMEMORY, код ошибки COM. Описание не очень полезно, этот код ошибки, как правило, возвращается для любых ошибок "вне ресурсов" с помощью кода Microsoft, а не только из памяти. Может быть достигнуто внутренним пределом, может быть вызванный winapi вызов.

И это не обязательно ограничивается прямым программным обеспечением. Драйвер устройства мишующего устройства, который утечки памяти пула ядра может быть косвенным источником неудачи, например.

Вам повезет, если вы сможете найти что-то в журнале событий приложений, посмотрите как на машине, сообщающей об ошибке, так и на сервере домена. Диспетчер задач может дать ключ, добавить элементы Handles, GDI Objects, USER Object, Commit size, Page пул и NP Pool. Довольно трудно дать конкретные советы, кроме этого. Это, без сомнения, утечка, так же, как и при перезагрузке машины, для восстановления. Удачи, охотясь за ней.

Ответ 2

Вы вызываете Release на m_DSSearch? Также, если вы ищете, вам нужно вызвать CloseSearchHandle или AbandonSearch. Если вы не делаете ни того, ни другого, вы можете медленно терять память.

Ответ 3

Ваш процесс может фрагментировать кучу до точки, так что ADsOpenObject не может найти последовательную часть памяти, которая достаточно велика.

Вы можете использовать VMMap для профилирования использования вашей памяти: http://technet.microsoft.com/en-us/sysinternals/dd535533

Вы можете попробовать включить низкую кучу фрагментации: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v=vs.85).aspx

Ответ 4

Если он теперь начинает появляться, и это было не раньше, я бы предположил одну из двух возможностей: это связано с временем (точнее, годом, тысячелетием). Другим вариантом будет проблема с архитектурой 32/64 бит.

Теперь помните, что я не программирую С++. Но я немного разбираюсь в ошибках MS (я работал над справочной службой MS...)