Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.01.16;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при вызове 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;
Скачать: [xml.tar.bz2];

Наверх





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


2-1287532202
Константинов
2010-10-20 03:50
2011.01.16
приложение клиент сервер не обновляется БД


15-1285896207
wl
2010-10-01 05:23
2011.01.16
Антивирус for free


15-1285862036
Алик
2010-09-30 19:53
2011.01.16
Права пользователей


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский