Главная страница
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.012 c
15-1286051355
Юрий
2010-10-03 00:29
2011.01.16
С днем рождения ! 3 октября 2010 воскресенье


15-1285648147
KSergey
2010-09-28 08:29
2011.01.16
В чем смысл WebMoney на текущем историческом отрезке?


2-1287916159
Первокурсница
2010-10-24 14:29
2011.01.16
INSERT INTO table поля из двух других связанных таблиц


15-1285760336
БарЛог
2010-09-29 15:38
2011.01.16
Разрешить USB floppy, запретить USB HDD


2-1287417521
кроссман
2010-10-18 19:58
2011.01.16
Выделить строку в listbox