Форум: "Прочее";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
ВнизAV непонятный Найти похожие ветки
← →
Dmitry S © (2008-03-04 20:40) [0]Написал функцию:
uses ...activeds_tlb, AdsHlp;
function UserExists(SamId:String):Boolean;
var
Hr: HRESULT;
Search: IDirectorySearch;
p : array[0..0] of PWideChar;
opt : array[0..0] of ads_searchpref_info; // has to be an array
ptrResult: THandle;
col : ads_search_column;
begin
Result := false;
Hr := ADsOpenObject(
"LDAP://da.net.domain.ru/DC=net,DC=domain,DC=ru",
"user",
"123",
ADS_SECURE_AUTHENTICATION,
IDirectorySearch,
Search
);
if Succeeded(Hr) then
begin
p[0] := "Name";
opt[0].dwSearchPref := ADS_SEARCHPREF_SEARCH_SCOPE;
opt[0].vValue.dwType := ADSTYPE_INTEGER;
opt[0].vValue.Integer := ADS_SCOPE_SUBTREE;
Hr := Search.SetSearchPreference(@opt[0], 1);
if Succeeded(Hr) then
begin
Hr := Search.ExecuteSearch("(&(sAMAccountName="+SamId+")(objectCategory=User))", @p[0], 1, ptrResult);
Hr := Search.GetNextRow(ptrResult);
while Hr <> S_ADS_NOMORE_ROWS do
begin
Hr := Search.GetColumn(ptrResult, p[0], col);
if Succeeded(Hr) then
begin
if col.pADsValues <> nil then
begin
MessageBoxW(0, col.pAdsvalues^.NumericString, "", 0);
end;
Search.FreeColumn(col);
end;
Hr := Search.GetNextRow(ptrResult);
end;
end;
end;
Result := true;
end;
Дальше создаю форму кидаю на нее батон:
procedure TfrmMain.Button1Click(Sender: TObject);
begin
UserExists("Dima");
Caption := "123";
end;
Функция правильно находит пользователя в каталоге, выводит Диалог, но потом, при выполнении (!) выделенной строчки вываливается в AV (чтение из адреса 00000000) или Привилегированная инструкция (в окне CPU на инструкцию In указывает).
Если в функции после
Hr := ADsOpenObject(
"LDAP://da.net.domain.ru/DC=net,DC=domain,DC=ru",
"user",
"123",
ADS_SECURE_AUTHENTICATION,
IDirectorySearch,
Search
);
поставить
Exit
то результат будет тот же самый.
ADsOpenObject
определена как :const ADSI = "activeds.dll";
function ADsOpenObject(lpszPathName:WideString;
lpszUserName:WideString;
lpszPassword:WideString;
dwReserved:DWORD;
const riid:TGUID;
out ppObject):HRESULT; safecall;
function ADsOpenObject ;external ADSI;
Что это может быть? Куда капать?
← →
Сергей М. © (2008-03-05 08:33) [1]С какого перепугу safecall ?
← →
Dmitry S © (2008-03-05 10:15) [2]
> Сергей М. ©
я с инета этот модуль скачал.
исправить на stdcall ?
← →
Сергей М. © (2008-03-05 10:35) [3]
> я с инета этот модуль скачал
инет - большая помойка, мало ли в ней мусора ...
> исправить на stdcall ?
Понятия не имею. Скорее всего да. Но уж точно не safecall.
> WideString
Это же искл-но дельфийский тип !
Что он у тебя делает в декларации WinAPI-функции - тоже непонятно ..
← →
Сергей М. © (2008-03-05 10:49) [4]Сравнивай:
http://delphi.newswhat.com/geoxml/forumhistorythread?groupname=borland.public.delphi.nativeapi.win32&messageid=428 49393@newsgroups.borland.com
← →
Игорь Шевченко © (2008-03-05 11:59) [5]
> С какого перепугу safecall ?
А какая разница ?
← →
Сергей М. © (2008-03-05 12:38) [6]
> какая разница ?
В дан.случае да, никакой.
Но и это и не интерфейсный вызов, где (цитата)
The safecall convention must be used for declaring dual-interface methods
← →
Сергей М. © (2008-03-05 12:50) [7]
> В дан.случае да, никакой.
Ой .. Нагло вру)
Разница велика, но она заключается вовсе не в порядке/способе передачи параметров/результата и отсетственности за балансировку стека. Указание safecall предписывает компилятору выполнить еще кой-какие неявные, но весьма важные действия.
Читаем, к примеру, сюда и освежаем сабж в памяти:
http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B0
← →
Игорь Шевченко © (2008-03-05 13:10) [8]Сергей М. © (05.03.08 12:50) [7]
Да, прошу пардону - я тоже слово out не заметил в прототипе
← →
guav © (2008-03-05 13:13) [9]На самом деле safecall процедура соответствует stdcall функции, возвращающей HRESULT, если объявить safecall функцию, она будет соответствовать stdcall функции с дополнительным var параметром, где будет результат.
← →
Сергей М. © (2008-03-05 13:17) [10]
> Игорь Шевченко © (05.03.08 13:10) [8]
А дело даже не в out.
← →
Dmitry S © (2008-03-05 13:20) [11]Важно, что с stdcall стало работать как надо:)
← →
Сергей М. © (2008-03-05 13:21) [12]
> с stdcall стало работать как надо
Что, при WideString заработало ?!
Чудны дела твои, Господи)..
← →
Dmitry S © (2008-03-05 13:23) [13]
> Сергей М. ©
надо почитать как дельфи передает WideString.
Видимо как указатель массив символов до #0 указывая на первый из них. Поэтому проблем и не возникает.
← →
Сергей М. © (2008-03-05 13:27) [14]
> Поэтому проблем и не возникает
До поры до времени и грабли не стреляют.
← →
oxffff © (2008-03-05 13:37) [15]
> Dmitry S © (05.03.08 13:23) [13]
>
> > Сергей М. ©
>
> надо почитать как дельфи передает WideString.
> Видимо как указатель массив символов до #0 указывая на первый
> из них. Поэтому проблем и не возникает.
Проблемы не возникнут?. До тех пор, пока есть корень в твоей программе life time корого дольше вызова функции, а это либо переменная содержащая строку, либо константа (тут тебе повезло).
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.046 c