Форум: "Прочее";
Текущий архив: 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