Einzelnen Beitrag anzeigen

Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#44

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

  Alt 24. Feb 2010, 08:49
Zitat von Remko:
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:
function ADsOpenObject(lpszPathName:WideString;
                       lpszUserName:WideString;
                       lpszPassword:WideString;
                       dwReserved:DWORD;
                       const riid:TGUID;
                       out ppObject):HRESULT; safecall;
which should be using PWideChar instead of WideString. The declaration in the Jedi Apilib (JwaActiveDs) is correct btw:
Delphi-Quellcode:
 function ADsOpenObject(lpszPathName, lpszUserName, lpszPassword: LPCWSTR;
  dwReserved: DWORD; const riid: REFIID; out ppObject: Pointer): HRESULT; stdcall;
HURRA!! Genau das scheint die Lösung zu sein. Die einzige die bei mir keine Gänsehaut hervorruft. Danke.

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;
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat