Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.16;
Скачать: CL | DM;

Вниз

Ошибка при вызове ADsFreeEnumerator   Найти похожие ветки 

 
Empleado ©   (2010-09-21 20:57) [0]

Почему-то, когда вызываю ADsFreeEnumerator, то как-то жизнь меняет свой цвет на серый, музыка замолкает и даже птиц на улице не слышно ... одним словом access violation at 0x102 ...


uses Windows, Classes, ActiveDs_TLB, ActiveX;

const
 ADSIDLLName = "Activeds.dll";

{Exported functions}
function ADsGetObject(lpszPathName: WideString; const riid: TGUID; out ppObject): HRESULT; safecall; external ADSIDLLName;
function ADsBuildEnumerator(pADsContainer: IADsContainer; out ppEnumVariant: IEnumVARIANT): HRESULT; safecall; external ADSIDLLName;
function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG; out pvar: OleVARIANT; out pcElementsFetched: ULONG): HRESULT; safecall; external ADSIDLLName;
function ADsFreeEnumerator(pEnumVariant: IEnumVARIANT): HRESULT; safecall; external ADSIDLLName;

...
procedure GetADUsers(ADsContainer: IADsContainer; UsersList: TStrings);
var HRes: HRESULT;
   EnumVARIANT: IEnumVARIANT;
   pvar: OleVARIANT;
   pcElementsFetched: ULONG;
   ADs: IADs;
begin {Enumeration with helper functions (ADsBuildEnumerator, ...)}
 {To enumerate the available objects in a container (from MSDN):
 1. Call the ADsBuildEnumerator function to create an IEnumVARIANT object that will enumerate the contents of the container.
 2. Call the ADsEnumerateNext function as many times as necessary to retrieve the items from the enumerator object.
 3. Call the ADSFreeEnumerator function to release the enumerator object when it is no longer required}

 if not Assigned(ADsContainer) then raise Exception.Create("GetADUsers: Unable to enumerate domain users (the ADsContainer interface is not assigned)");
 UsersList.Clear;
 ADsContainer.Filter := VarArrayOf(["user"]); {set filter to retrieve the users only}

 HRes := ADsBuildEnumerator(ADsContainer, EnumVARIANT);
 if Succeeded(HRes) then
    try
       while Succeeded(HRes) do begin
             HRes := ADsEnumerateNext(EnumVARIANT, 1, pvar, pcElementsFetched);
             if pcElementsFetched > 0 then begin
                if IDispatch(pvar).QueryInterface(IID_IADs, ADs) = 0 then begin {Or ADs := IDispatch(pvar) as IADs}

                   {test}
                   if ADs.Name = "CN=WINS Users" then
                   MessageBox(0,
                              PChar(ADs.Name),
                              "DEBUG MESSAGE:",
                              MB_OK or MB_ICONINFORMATION);
                end
                else raise Exception.Create("GetADUsers: Unable to get the ADs interface")
             end
             else Break
       end
    finally
       VariantClear(pvar);
       ADs := nil;
       ADsFreeEnumerator(EnumVARIANT);
//        EnumVARIANT := nil
    end
 else begin
      if Assigned(EnumVARIANT) then EnumVARIANT := nil;
      raise Exception.Create("GetADUsers: Error occurred when calling ADsBuildEnumerator")
 end
end;


Без ADsFreeEnumerator все работает.
Вопрос: "А почему собсснно?! (Жванецкий)".
Где я недочитал?
Спасибо.


 
Empleado ©   (2010-09-22 12:11) [1]

Всю ночь снились кошмары ... Настроение подавленное, в горле сухо ...
У меня жуткое ощущение, что даже после вызова ADsFreeEnumerator, Делфи все-таки пытается наглым образом, своим неомрачимым способом, избавиться от используемых интерфейсов и занимаемой памяти...


 
Empleado ©   (2010-09-23 18:19) [2]

Сегодня попробовал открыть шторы и выйти из комы.
Двухдневная небритость, вздыбленные волосы, впалые глаза. Бутылка Буратино катается под ногами.
Зеркало отшатнулось при виде меня ...
Вся эта душераздирающая атмосфера, нагнятаемая простым ADsFreeEnumerator ..., хотя без него мемликов неотрепортировано.
На улице безликость: то ли осень, то ли весна.
Сквозь пелену кошмаров видел сон: мороз, снег, холодно,.., микрософт и борланд босиком в Аустине бьются интерфейсами... Если во сне увидишь покойника, к чему бы это?...


 
DiamondShark ©   (2010-09-23 18:38) [3]


> У меня жуткое ощущение, что даже после вызова ADsFreeEnumerator,
>  Делфи все-таки пытается наглым образом, своим неомрачимым
> способом, избавиться от используемых интерфейсов и занимаемой
> памяти...

Предчувствия его не обманули.

Интерфейсные ссылки автоматически финализируются при выходе из области видимости.

ADsFreeEnumerator(EnumVARIANT);
Pointer(EnumVARIANT) := nil; // так обманем

это лишнее
if Assigned(EnumVARIANT) then EnumVARIANT := nil;


 
Empleado ©   (2010-09-28 16:17) [4]


> DiamondShark ©   (23.09.10 18:38) [3]

Спасибо!

> Интерфейсные ссылки автоматически финализируются при выходе
> из области видимости

Вот бы еще в хелпе оное найти ...



Страницы: 1 вся ветка

Текущий архив: 2011.01.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
15-1285705757
Юрий
2010-09-29 00:29
2011.01.16
С днем рождения ! 29 сентября 2010 среда


2-1287581417
mfender
2010-10-20 17:30
2011.01.16
Дифференцированный подход Delphi )))


2-1287986449
Irisss
2010-10-25 10:00
2011.01.16
Компилятор игнорирует Breakpoint


2-1287920194
George
2010-10-24 15:36
2011.01.16
Индикатор растягиваемости формы


2-1287855766
aha
2010-10-23 21:42
2011.01.16
вопрос по сохранению данных