Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
You are doing something VERY wrong!
First you declare ptrResult as THandle:
Delphi-Quellcode:
Later on you cast it to a pointer:
ptrResult: THandle;
Delphi-Quellcode:
You are actually lucky that it works because a pointer is actually a dword therefore it works but the correct way would IMO be:
hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, Pointer(ptrResult));
ptrHandle: PHandle;
Delphi-Quellcode:
If you need to pass it as handle later on use
hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, ptrResult);
Delphi-Quellcode:
to derefence the pointer.
ptrHandle^
/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. |
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. |
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. |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Vllt. braucht man GetFirstResult zuerst?
|
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Versuche zunächst mal ganz klein anzufangen:
Delphi-Quellcode:
Und auch ...
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;
Delphi-Quellcode:
Was mach ich denn falsch?
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; |
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. |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Zitat:
Zudem habe ich das Testhalber kurz gemacht und es klappte trotzdem nicht... > Zugriffsverletzung an derselben Stelle! |
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; |
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:
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:
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;
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; |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Liste der Anhänge anzeigen (Anzahl: 1)
Hi
hier mein Änderungen:
Delphi-Quellcode:
Im Anhang der Directorysearcher.
// *********************************************************************//
// 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; Alter Mann |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr. |
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