Главная страница
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-1286210928
@!!ex
2010-10-04 20:48
2011.01.16
Где купить Штеуд не совместимый компьютер?


2-1288094860
fiascko
2010-10-26 16:07
2011.01.16
перевод из 16ой в 10ую


15-1285792164
Юрий
2010-09-30 00:29
2011.01.16
С днем рождения ! 30 сентября 2010 четверг


2-1287571571
Scott Storch
2010-10-20 14:46
2011.01.16
вопрос по дженерикам


15-1285734450
И. Павел
2010-09-29 08:27
2011.01.16
Можно ли использовать невизуальные компоненты в др. потоке?