Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Hallo Cherry!
schau dir mal die Threads an ADSI Stackproblem. vielleicht liegt es bei dir auch an einem Stack-Problem(?) Damit würden sich zumindest einige der Probleme erklären... |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Zitat:
|
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Dezipaitor pointed me to this topic, although I didn't test your code I am sure the problem is the declaration in AdsHlp:
Delphi-Quellcode:
which should be using PWideChar instead of WideString. The declaration in the Jedi Apilib (JwaActiveDs) is correct btw:
function ADsOpenObject(lpszPathName:WideString;
lpszUserName:WideString; lpszPassword:WideString; dwReserved:DWORD; const riid:TGUID; out ppObject):HRESULT; safecall;
Delphi-Quellcode:
function ADsOpenObject(lpszPathName, lpszUserName, lpszPassword: LPCWSTR;
dwReserved: DWORD; const riid: REFIID; out ppObject: Pointer): HRESULT; stdcall; |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Zitat:
Nun habe ich ein kleines Folgeproblem... Bis jetzt hat bei mir die Funktion ADsGetObject/ADsOpenObject immer eine EOleException ausgelöst, wenn was nicht i.O. war. Diese konnte ich dann super verwenden. Wenn jetzt z.B eine Authentifizierung mit ADsOpenObject() fehlschlägt, kann ich zwar checken ob SUCCEEDED(HRESULT) oder nicht, jedoch löst es (nachdem die Funktionen korrekt deklariert sind, nochmals Danke Remko) keine eOleExceptions mehr aus... habe jetzt angefangen mir dazu eine Hilfsfunktion zu bauen, nur leider scheints endlos zu sein, jedenfalls der ADsOpenObject Fehlercode wenn ich z.B ein falsches Passwort angebe, habe ich noch nicht rausgekriegt. Oder ist der Ansatzt schon mal falsch?
Delphi-Quellcode:
function ShowEx(hr: HRESULT): String;
resourcestring rsERROR_FILE_NOT_FOUND = 'Objekt nicht gefunden.'; rsERROR_ACCESS_DENIED = 'Zugriff verweigert.'; rsERROR_NOT_ENOUGH_MEMORY = 'System hat zuwenig speicher.'; rsERROR_GEN_FAILURE = 'Unbekannter Fehler.'; rsERROR_DEV_NOT_EXIST = 'Server ist nicht verfügbar.'; rsERROR_BAD_NET_RESP = 'Kommunikation mit dem LDAP-Server kann nicht aufgebaut werden.'; rsERROR_UNEXP_NET_ERR = 'Ver- / Entschlüsselungsfehler ist aufgetreten.'; rsERROR_TOO_MANY_NAMES = 'Limite der verbundenen Administratoren ist erreicht.'; rsERROR_INVALID_PASSWORD = 'Authentifizierung fehlgeschlagen.'; rsERROR_INVALID_PARAMETER = 'Syntax oder Parameter ist nicht korrekt'; rsERROR_OPEN_FAILED = 'Operationsfehler ist aufgetreten.'; rsERROR_INSUFFICIENT_BUFFER = 'Resultat ist zu gross.'; rsERROR_INVALID_NAME = 'Syntaxfehler.'; rsERROR_INVALID_LEVEL = 'Protokollfehler.'; rsERROR_ALREADY_EXISTS = 'Objekt ist bereits vorhanden.'; rsERROR_MORE_DATA = 'Es wurden nicht alle benötigten Informationen erhalten.'; rsERROR_BUSY = 'Server ist beschäftigt.'; rsERROR_CAN_NOT_COMPLETE = 'Server kann die Operation nicht durchführen.'; rsERROR_SERVICE_REQUEST_TIMEOUT = 'Timeout abgelaufen.'; rsERROR_EXTENDED_ERROR = 'Erweiterter Fehler.'; rsERROR_CANCELLED = 'Aktion wurde durch den Benutzer abgebrochen.'; rsERROR_NOT_ENOUGH_QUOTA = 'Zeit- oder Grössenlimit erreicht.'; rsERROR_LOGON_FAILURE = 'Die angegebene Anmeldeinformationen sind ungültig.'; rsERROR_OBJECT_ALREADY_EXISTS = 'Das Objekt ist bereits vorhanden.'; begin if (hr and ERROR_FILE_NOT_FOUND = 0) then result := rsERROR_FILE_NOT_FOUND else if (hr and ERROR_ACCESS_DENIED = 0) then result := rsERROR_ACCESS_DENIED else if (hr and ERROR_NOT_ENOUGH_MEMORY = 0) then result := rsERROR_NOT_ENOUGH_MEMORY else if (hr and ERROR_GEN_FAILURE = 0) then result := rsERROR_GEN_FAILURE else if (hr and ERROR_DEV_NOT_EXIST = 0) then result := rsERROR_DEV_NOT_EXIST else if (hr and ERROR_BAD_NET_RESP = 0) then result := rsERROR_BAD_NET_RESP else if (hr and ERROR_UNEXP_NET_ERR = 0) then result := rsERROR_UNEXP_NET_ERR else if (hr and ERROR_TOO_MANY_NAMES = 0) then result := rsERROR_TOO_MANY_NAMES else if (hr and ERROR_INVALID_PASSWORD = 0) then result := rsERROR_INVALID_PASSWORD else if (hr and ERROR_INVALID_PARAMETER = 0) then result := rsERROR_INVALID_PARAMETER else if (hr and ERROR_OPEN_FAILED = 0) then result := rsERROR_OPEN_FAILED else if (hr and ERROR_INSUFFICIENT_BUFFER = 0) then result := rsERROR_INSUFFICIENT_BUFFER else if (hr and ERROR_INVALID_NAME = 0) then result := rsERROR_INVALID_NAME else if (hr and ERROR_INVALID_LEVEL = 0) then result := rsERROR_INVALID_LEVEL else if (hr and ERROR_ALREADY_EXISTS = 0) then result := rsERROR_ALREADY_EXISTS else if (hr and ERROR_MORE_DATA = 0) then result := rsERROR_MORE_DATA else if (hr and ERROR_BUSY = 0) then result := rsERROR_BUSY else if (hr and ERROR_CAN_NOT_COMPLETE = 0) then result := rsERROR_CAN_NOT_COMPLETE else if (hr and ERROR_SERVICE_REQUEST_TIMEOUT = 0) then result := rsERROR_SERVICE_REQUEST_TIMEOUT else if (hr and ERROR_EXTENDED_ERROR = 0) then result := rsERROR_EXTENDED_ERROR else if (hr and ERROR_CANCELLED = 0) then result := rsERROR_CANCELLED else if (hr and ERROR_NOT_ENOUGH_QUOTA = 0) then result := rsERROR_NOT_ENOUGH_QUOTA else if (hr and ERROR_LOGON_FAILURE = 0) then result := rsERROR_LOGON_FAILURE end; |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
AdsOpenObject always returns a HRESULT which you can check against known values (case hr of). When you declare a function as safecall in Delphi a wrapper (sometimes called an exception firewall) is added that will raise exceptions for you. If you want you can declare the function as safecall (just replace stdcall with safecall) and use a try..except handler.
PS: the other functions in AdsHlp such as AdsGetObject have the same declaration using WideString so you should change those as well... |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Zitat:
Danke an Remko für den Tipp! :thumb: |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Zitat:
Wenn ich die Funktionen AdsGetObject/AdsOpenObject mit safecall deklariere, werden zwar die exceptions wieder ausgelöst nur verhaltet sich das Ganze wieder ähnlich unstabil wie vorher... Diese Funktion zeigt mir einen Benutzer an und die dazugehörigen Gruppen... Dies funktioniert wenn ich die Funktionen im Wrapper mit stdcall deklariere, nicht aber mit safecall! >> wenn ich das Auflisten der Gruppen auskommentiere gehts... ist doch komisch oder?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var usr: IADsUser; begin ClearFields; ShowUser(EdLDAP.Text, CBShowUser); sEditedFields.Clear; sOldObjectPath := EdLDAP.Text; if SUCCEEDED(AccessObject(EdLDAP.Text, IADsUser, usr)) then EnumGroupsOfUser(usr, ListBox1.Items); //<-- Access Violation here >> Die Haltepunkte in der Funktion kommen nicht zum Zug!!! end; |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
I don't understand what you are trying to do with showex and the hr values, you should use the error values as declared in JwaAdsErr.pas such as E_ADS_BAD_PATHNAME and E_ADS_INVALID_DOMAIN_OBJECT.
|
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
ist euch eigentlich aufgefallen dass die If Bedingungen von cherry falsch sind ?
Zitat:
richtig wäre :
Delphi-Quellcode:
if ((hr and ERROR_FILE_NOT_FOUND)= ERROR_FILE_NOT_FOUND) then
result := rsERROR_FILE_NOT_FOUND |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Ich kann mich nur schon wieder aufregen, dass jeder glaubt so einfach von C nach Delphi WinAPI Header Dateien konvertieren zu können. Der Thread hier ist ein großes Beispiel, dass es oftmals nicht funktioniert.
Ich vermute noch viel mehr Fehler in diesen Units. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 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