Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2008, 12:05   #1
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
Вопрос AD (LDAP) - ошибка в коде, на рассмотрение

Доброго Вам времени суток,

У меня по задаче получается множество обращений к AD. Сделал модуль, но есть с ним проблемы.

Допустим после вызова открытия контейнера и энумерации ( проходят нормально ) если попытатся добавить скажем TComboItemEx или в дерево или вообще создать объект то прога рушится с сылкой на неверный адрес памяти. Если функция энумерации последняя в исполняемой функции, то все ок.

Ниже привожу пример функции ( модуль большой, так понятнее и меньше - все одно одинаково упадает )
Код:
var
   fADCont      : IADsContainer;
   ADEnum       : IEnumVariant;
   ADItemsCount : ULONG;
   ADItem       : IADs;
   ADVArr       : OleVariant;
   hRes         : HRESULT;
begin
  if Failed ( ADsOpenObject ( fLDAP, fUsr, fPwd, 1, IADsContainer, fADCont )) then
    Exit;

  if Failed (ADsBuildEnumerator ( fADCont, ADEnum )) then
    Exit;

  while SUCCEEDED (hRes) do
    begin
      hRes := ADsEnumerateNext ( ADEnum, 1, ADVArr, ADItemsCount );

      if ( ADItemsCount <= 0 ) then
         break
      else

      IDispatch (ADVArr).QueryInterface ( IADs, ADItem );
    end;
Теперь допустим вызываем такую вот функцию и :
Код:
ComboBoxEx.ItemsEx.AddItem (bla-bla-bla); {Вот тут мы и падаем}
Что именно идет после - не важно, главное - создается что-то.
Т.е. допустим присваение переменных проходит спокойно.

Что делать?
Mouse123 вне форума Ответить с цитированием
Старый 27.06.2008, 12:20   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

а падаем- то с какой ошибкой ?
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 27.06.2008, 12:26   #3
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
По умолчанию

---------------------------
Debugger Fault Notification
---------------------------
Project N:\Projects\......exe faulted with message: 'access violation at 0x7c92ab32: write of address 0x00040ffc'. Process Stopped. Use Step or Run to continue.
---------------------------

Падёж в ntdll.dll ... адресация, кажется, вообще каждый раз разная.

Чтож делать то ... я, конечно, пока могу это пережить, но
а) стабильность софта уже не та
б) потом потребуется именно такой подход

Может можно как-то иначе стуканутся в AD? ( открытые компоненты например ), но не сторонние библиотеки/комм. компоненты/com

p.s.
тыкаюсь по LDAP

Допустим создадим IADs сами. Т.е. :
Код:
var
   fADCont      : IADsContainer;
   ADEnum       : IEnumVariant;
   ADItemsCount : ULONG;
   ADItem       : IADs;
   ADVArr       : OleVariant;
   hRes         : HRESULT;
begin
  if Failed ( ADsOpenObject ( fLDAP, fUsr, fPwd, 1, IADsContainer, fADCont )) then
    Exit;

  if Failed (ADsBuildEnumerator ( fADCont, ADEnum )) then
    Exit;

  ADItem := fADCont.Create ('User','ActiveDirectoryUser') as IADs;

  while SUCCEEDED (hRes) do
    begin
      hRes := ADsEnumerateNext ( ADEnum, 1, ADVArr, ADItemsCount );

      // if we done
      if ( ADItemsCount <= 0 ) then
         break
      else

      IDispatch (ADVArr).QueryInterface ( IADs, ADItem );
      CbUserLoginBox.Items.Add ( ADItem.Get('sAMAccountName'));
      StInfUserFQDN.Caption := ADItem.ADsPath;
    end;
Но все побоку.

Вроди все же верно ... чего делать то? :`(

Cверил с другими вариантами - принцип вроди верный же... wtf?!

Последний раз редактировалось Stilet; 01.07.2008 в 09:30.
Mouse123 вне форума Ответить с цитированием
Старый 30.06.2008, 14:10   #4
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
По умолчанию

решения пока не нашел, однако, если вызов функции с обращением в AD засунуть в try, то все тихо и мирно. Сессно на перехвате ошибки просто пропускаем ее, но она, что совсем уже идиотично, просто не появляется. 8-) Я в шоке))
Mouse123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ ошибка в коде. Непонимаю что не так POPOV Помощь студентам 2 04.09.2008 18:04
Ошибка в коде (BorderStyle) Airou Общие вопросы Delphi 10 24.05.2008 19:50
Ошибка в коде nikleb Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 10.03.2008 22:48
Где ошибка в коде? Македонский Общие вопросы Delphi 16 10.09.2007 15:45
Что в коде не так? Simply-Art Общие вопросы Delphi 3 08.07.2007 19:32