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...)