ADsOpenObject () возвращает -2147024882 (0x8007000E) — & gt; НЕДОСТАТОЧНО ПАМЯТИ

У меня есть 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)

который НЕДОСТАТОЧНО ПАМЯТИ. Когда я перезапускаю службу, использующую мою DLL, она работает нормально в течение нескольких недель, но затем начинают возникать ошибки.

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

10

Решение

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

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

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

Вам повезет, если вы сможете найти что-то обратно в журнале событий приложений, посмотрите как на машине, которая сообщает об ошибке, так и на сервере домена. Диспетчер задач может дать подсказку, добавить столбцы «Ручки», «Объекты GDI», «Объект USER», «Размер фиксации», «Пул страниц» и «Пул NP». Довольно сложно дать конкретный совет помимо этого. Это, без сомнения, утечка, громко крякает, как одна, когда вам приходится периодически перезагружать машину для восстановления. Удачи в охоте.

4

Другие решения

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

2

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

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

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

0

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

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

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector