Delphi-PRAXiS
Seite 7 von 9   « Erste     567 89      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Zugriffsverletzung ADSI, so was komisches hab ich noch nie.. (https://www.delphipraxis.net/146499-zugriffsverletzung-adsi-so-komisches-hab-ich-noch-nie.html)

Remko 24. Feb 2010 14:11

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
You are doing something VERY wrong!
First you declare ptrResult as THandle:
Delphi-Quellcode:
  ptrResult: THandle;
Later on you cast it to a pointer:
Delphi-Quellcode:
hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, Pointer(ptrResult));
You are actually lucky that it works because a pointer is actually a dword therefore it works but the correct way would IMO be:
ptrHandle: PHandle;

Delphi-Quellcode:
hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, ptrResult);
If you need to pass it as handle later on use
Delphi-Quellcode:
ptrHandle^
to derefence the pointer.

/Edit just a remark: I know this is just test code but if you change a variable type ALWAYS change it's name as well as you WILL confuse yourself later on ( or DelphiPraxis members reading your code ;-) )
Also when you post example code, please take the effort of cleaning it up as much as possible.

cherry 24. Feb 2010 14:27

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
Danke nochmals für dein Engagement. Leider ändert sich auch dann nichts. Auch wenn ich "ptrResult: Pointer;" habe.
Komisch ist, dass "hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, ptrResult);" = S_OK ist, aber die Zeile weiter unten:
"hr := search.GetNextRow(Pointer(ptrResult)); " in einer Zugriffsverletzung endet.

Hast du viellecht ein funktionierendes Beispiel, das wäre wohl das einfachste. Ansonsten probiere ich mir hier einen ab. ;-)
Danke schon mal.

Remko 24. Feb 2010 14:30

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
First you use ptrResult in ExecuteSearch and then you use Pointer(ptrResult) in search.GetNextRow ??
I suggest you do a good cleanup of your code and post that, stating what is and what is not working.

Dezipaitor 24. Feb 2010 14:36

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
Vllt. braucht man GetFirstResult zuerst?

cherry 24. Feb 2010 14:57

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
Versuche zunächst mal ganz klein anzufangen:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
const
  ColCount = 3;
  ColNames : array[0..ColCount-1] of PWideChar = ('Name','Description','ADsPath');
var
  search: IDirectorySearch;
  ptrResult: Pointer;
  hr : HRESULT;
begin
  if SUCCEEDED(ADsGetObject(PWideChar('LDAP://DC=thun,DC=lan'), IDirectorySearch, Pointer(search))) then
  begin
    if SUCCEEDED(search.ExecuteSearch('(objectClass=organizationalUnit)',@ColNames,ColCount,ptrResult)) then
    begin
      hr := search.GetNextRow(ptrResult); // Zugriffsverletzung
    end;
  end;
end;
Und auch ...

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
const
  ColCount = 3;
  ColNames : array[0..ColCount-1] of PWideChar = ('Name','Description','ADsPath');
var
  search: IDirectorySearch;
  ptrResult: Pointer;
  hr : HRESULT;
begin
  if SUCCEEDED(ADsGetObject(PWideChar('LDAP://DC=thun,DC=lan'), IDirectorySearch, Pointer(search))) then
  begin
    if SUCCEEDED(search.ExecuteSearch('(objectClass=organizationalUnit)',@ColNames,ColCount,ptrResult)) then
    begin
      hr := search.GetFirstRow(ptrResult); // Zugriffsverletzung
    end;
  end;
end;
Was mach ich denn falsch?

Alter Mann 24. Feb 2010 15:00

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
Hallo

In diesem Beitrag habe ich damals schon auf ein paar Unstimmigkeiten hingewiesen.

Das mit der nicht geschriebenen Mail tut mir leid.

cherry 24. Feb 2010 15:17

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
Zitat:

Zitat von Alter Mann
Hallo

In diesem Beitrag habe ich damals schon auf ein paar Unstimmigkeiten hingewiesen.

Das mit der nicht geschriebenen Mail tut mir leid.

Du meinst das mit Pointer und THandle nehm ich an?! Nun, da ich ja jetzt die JEDI units verwende verwende ich auch jwaADsTLB, und ich weiss nicht ob ich da einfach das IDirectoryInterface ändern soll?!
Zudem habe ich das Testhalber kurz gemacht und es klappte trotzdem nicht... > Zugriffsverletzung an derselben Stelle!

Remko 24. Feb 2010 15:36

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
I have seen the problem: delphi creates garbage when importing the TypeLib for Active Directory. I reimported the typelib from c:\windows\system32\activeds.tlb with Delphi 2010 and it's still the same mess. The declaration of IDirectorySearch is totally wrong (and the one in AdsHlp.pas is wrong as well).

This works fine for me:

Delphi-Quellcode:
type
  ADS_SEARCH_HANDLE = THandle;
  PADS_SEARCH_HANDLE = ^ADS_SEARCH_HANDLE;
// *********************************************************************//
// Interface: IDirectorySearch
// Flags:    (0)
// GUID:     {109BA8EC-92F0-11D0-A790-00C04FD8D5A8}
// *********************************************************************//
  IDirectorySearch = interface(IUnknown)
    ['{109BA8EC-92F0-11D0-A790-00C04FD8D5A8}']
    function SetSearchPreference(var pSearchPrefs: ads_searchpref_info; dwNumPrefs: LongWord): HResult; stdcall;
    function ExecuteSearch(pszSearchFilter: PWideChar; pAttributeNames: PWideChar;
                            dwNumberAttributes: LongWord; var phSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function AbandonSearch(phSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetFirstRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetNextRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetPreviousRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetNextColumnName(hSearchHandle: ADS_SEARCH_HANDLE; out ppszColumnName: PWideChar): HResult; stdcall;
    function GetColumn(hSearchResult: ADS_SEARCH_HANDLE; szColumnName: PWideChar;
                        out pSearchColumn: ads_search_column): HResult; stdcall;
    function FreeColumn(var pSearchColumn: ads_search_column): HResult; stdcall;
    function CloseSearchHandle(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
  end;

procedure TMainForm.Button1Click(Sender: TObject);
var
  ColCount: DWORD;
  ColNames: array of PWideChar;
  DirSearch: IDirectorySearch;
  SearchHandle: ADS_SEARCH_HANDLE;
  hr : HRESULT;
begin
  ColCount := 1;
  SetLength(ColNames, 3);
  ColNames[0] := 'name';
  ColNames[1] := 'description';
  ColNames[2] := 'adspath';

  hr := ADsGetObject(PWideChar('LDAP://DC=rmi,DC=local'), IID_IDirectorySearch, Pointer(DirSearch));

  if failed(hr) then
    Exit;

  SearchHandle := 0;
  hr := DirSearch.ExecuteSearch('(objectClass=organizationalUnit)', @ColNames[0], Length(ColNames), SearchHandle);
  if failed(hr) then
    Exit;

  while DirSearch.GetNextRow(SearchHandle) <> S_ADS_NOMORE_ROWS do
  begin
    // Do something with result
  end;
  DirSearch.CloseSearchHandle(SearchHandle);
  DirSearch := nil;
end;

Remko 24. Feb 2010 15:56

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
Some more observations: the attribute names in pAttributeNames MUST BE lowerCASE or you will get empty results.
I made some more corrections to the declaration:
Delphi-Quellcode:
type
  ADS_SEARCH_HANDLE = THandle;
  PADS_SEARCH_HANDLE = ^ADS_SEARCH_HANDLE;
  PADS_SEARCH_COLUMN = ^ads_search_column;
// *********************************************************************//
// Interface: IDirectorySearch
// Flags:    (0)
// GUID:     {109BA8EC-92F0-11D0-A790-00C04FD8D5A8}
// *********************************************************************//
  IDirectorySearch = interface(IUnknown)
    ['{109BA8EC-92F0-11D0-A790-00C04FD8D5A8}']
    function SetSearchPreference(var pSearchPrefs: ads_searchpref_info; dwNumPrefs: LongWord): HResult; stdcall;
    function ExecuteSearch(pszSearchFilter: PWideChar; pAttributeNames: PWideChar;
                            dwNumberAttributes: LongWord; var phSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function AbandonSearch(phSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetFirstRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetNextRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetPreviousRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetNextColumnName(hSearchHandle: ADS_SEARCH_HANDLE; out ppszColumnName: PWideChar): HResult; stdcall;
    function GetColumn(hSearchResult: ADS_SEARCH_HANDLE; szColumnName: PWideChar;
                        var pSearchColumn: ads_search_column): HResult; stdcall;
    function FreeColumn(var pSearchColumn: ads_search_column): HResult; stdcall;
    function CloseSearchHandle(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
  end;
Accessing the search results will currently not work because the declaration of ADS_SEARCH_COLUMN is totally wrong in the typelib, so while this code should be correct the results cannot be displayed because of the wrong declaration:
Delphi-Quellcode:
  while DirSearch.GetNextRow(SearchHandle) <> S_ADS_NOMORE_ROWS do
  begin
    for i := 0 to Length(ColNames) - 1 do
    begin
      hr := DirSearch.GetColumn(SearchHandle, ColNames[i], col);
      if succeeded(hr) then
      begin
        // note that the typelib doesn't know the proper typed pointer and the anonymous union in it
        OutputDebugString(col.pADsValues^.__MIDL_0010.CaseIgnoreString);
        DirSearch.FreeColumn(col);
      end;
    end;
    // Do something with result
  end;

Alter Mann 24. Feb 2010 16:20

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi

hier mein Änderungen:
Delphi-Quellcode:
// *********************************************************************//
// Schnittstelle: IDirectorySearch
// Flags:    (0)
// GUID:     {109BA8EC-92F0-11D0-A790-00C04FD8D5A8}
// *********************************************************************//
  IDirectorySearch = interface(IUnknown)
    ['{109BA8EC-92F0-11D0-A790-00C04FD8D5A8}']
    function SetSearchPreference(var pSearchPrefs: ads_searchpref_info; dwNumPrefs: LongWord): HResult; stdcall;
    function ExecuteSearch(pszSearchFilter: PWideChar; pAttributeNames: PWideChar;
                           dwNumberAttributes: LongWord; out phSearchResult: THandle): HResult; stdcall;
    function AbandonSearch(var phSearchResult: THandle): HResult; stdcall;
    function GetFirstRow(var hSearchResult: THandle): HResult; stdcall;
    function GetNextRow(hSearchResult: THandle): HResult; stdcall;
    function GetPreviousRow(var hSearchResult: THandle): HResult; stdcall;
    function GetNextColumnName(var hSearchHandle: THandle; out ppszColumnName: PWideChar): HResult; stdcall;
    function GetColumn(hSearchResult: THandle; szColumnName: PWideChar;
                       out pSearchColumn: ads_search_column): HResult; stdcall;
    function FreeColumn(var pSearchColumn: ads_search_column): HResult; stdcall;
    function CloseSearchHandle(var hSearchResult: THandle): HResult; stdcall;
  end;
Im Anhang der Directorysearcher.

Alter Mann


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr.
Seite 7 von 9   « Erste     567 89      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz