Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1206126773
smartleds
2008-03-21 22:12
2008.04.20
Как бы из Сендера индекс текущего компонента получить


2-1206415904
Santon26
2008-03-25 06:31
2008.04.20
Работа с XML файлом


2-1206524710
AlexeyMir
2008-03-26 12:45
2008.04.20
Модальная форма


2-1206519435
dumka
2008-03-26 11:17
2008.04.20
БД и INET


15-1204548079
Dmitry S
2008-03-03 15:41
2008.04.20
один DCHP в двух сетях





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский