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;