Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.20;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
2-1206372200
Thrasher
2008-03-24 18:23
2008.04.20
Код цвета.


15-1204975614
Михаил
2008-03-08 14:26
2008.04.20
Диалог выбора типа линии


2-1206612850
nicky000
2008-03-27 13:14
2008.04.20
ConnectDialog


15-1204610072
boriskb
2008-03-04 08:54
2008.04.20
Ябеда


15-1204619181
@!!ex
2008-03-04 11:26
2008.04.20
Windows XP 32 + AMD 64 глюк