Visual c++ / ADO / LDAP Liefert nur Kauderwelsch bei Strings! (code funktioniert aber für numeric Values)



  • UPDATE:
    Typen wie: "Telephone Number" oder "Directory String" kann ich nicht vernünftig auslesen, es kommt immer dieser Datenschrott raus.

    alle numerischen Werte allerdings, oder "IA5 String" klappen problemlos und werden 1a ausgelesen.

    Wahrscheinlich sind die Daten noch in irgendeiner Weise codiert

    Kurze Erklärung zum Code:

    DIe Klasse CCustomRs nimmt die Umwandlung der Typen vor
    "IP", "testdir" und "test" sind Platzhalter die ich hier fürs Forum eingefügt habe.
    in "RecSet.m_telefonNumber" und "RecSet.m_uid" sollten eigentlich die richtigen Daten stehen, aber es kommt wie erwähnt nur das obige Kauderwelsch heraus.

    Vielleicht ist ja ein LDAP-Guru hier dabei.

    class CCustomRs : public CADORecordBinding
    {
    	BEGIN_ADO_BINDING(CCustomRs)
    ADO_FIXED_LENGTH_ENTRY(3,adInteger,m_gidNumber, lgidNumber,TRUE)
    	ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_telefonNumber, sizeof(m_telefonNumber), ltelefonNumberStatus,TRUE)
    	ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_uid, sizeof(m_uid), luid, TRUE)
    	END_ADO_BINDING()
    
    public:
    	INT m_gidNumber;
            CHAR m_telefonNumber[255];
    	CHAR m_uid[255];
    	ULONG ltelefonNumberStatus;
    	ULONG luid;
          	ULONG lgidNumber;
    };
    
    void CTESTFinalLDAPADODlg::OnOK() 
    {
    	_ConnectionPtr	CnnPtr; 
    	_RecordsetPtr	RecPtr;
    	CCustomRs 		RecSet;  
    	IADORecordBinding *picRs = NULL;
    	HRESULT	hr = S_OK;
    	_bstr_t bstrPassword = "";
    	_bstr_t bstrUserID = "";
    	_bstr_t bstrQuery = L"SELECT gidNumber,telephoneNumber,uid FROM 'LDAP://IP:389/uid=test,dc=testdir,dc=de'";	
    	_bstr_t bstrConnectString = L"Provider=ADsDSOObject;Data Source=LDAP://IP:389";
    
    	try
    	{
    		// Com-Umgebung initialisieren
    		hr = CoInitialize(NULL);   
    
    		if (hr != S_OK) throw _com_error(hr);
    
    		// Connection Object erzeugen...
    		hr = CnnPtr.CreateInstance(__uuidof(Connection),NULL); 
    		if (hr != S_OK) throw _com_error(hr);
    		// ...und eine Verbindung zum LDAP-Server öffnen		
    		hr = CnnPtr->Open(bstrConnectString, bstrUserID, bstrPassword, -1);		
    		if (hr != S_OK) throw _com_error(hr);
    
    		// Record Object erzeugen...
    		hr = RecPtr.CreateInstance(__uuidof(Recordset),NULL); 
    		if (hr != S_OK) throw _com_error(hr);
    		// ...und die Daten aus dem LDAP Verzeichnis einlesen
    		hr = RecPtr->Open(bstrQuery, CnnPtr.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );
    		if (hr != S_OK) throw _com_error(hr);
    
    		//Ausgabe
    		RecPtr->MoveFirst();
    		if (FAILED(RecPtr->QueryInterface(__uuidof(IADORecordBinding), (LPVOID *)&picRs))) _com_issue_error(E_NOINTERFACE);
    		picRs->BindToRecordset(&RecSet);
    		MessageBox(RecSet.m_telefonNumber,"Telefonnummer",MB_OK);
    		MessageBox(RecSet.m_uid,"UID",MB_OK);
                    char str[255];
    		itoa(RecSet.m_gidNumber,str,10);
    		MessageBox(str,"gidNumber",MB_OK);
    		// aufräumen
    		RecPtr->Close();
    		if (CnnPtr) CnnPtr.Release();
    		if (RecPtr) RecPtr.Release();
    		CoUninitialize();
    	}
    
    	catch( _com_error &e )
    	{
    		_bstr_t bstrSource(e.Source());
    		_bstr_t bstrDescription(e.Description());				
    		TRACE( "Exception thrown for classes generated by #import" );
    		TRACE( "\tCode = %08lx\n", e.Error());
    		TRACE( "\tCode meaning = %s\n", e.ErrorMessage());
    		TRACE( "\tSource = %s\n", (LPCTSTR) bstrSource);
    		TRACE( "\tDescription = %s\n", (LPCTSTR) bstrDescription);		
    		MessageBox(NULL,_com_util::ConvertBSTRToString(e.Description()),MB_OK);
    	}
    
    	catch (...)
    	{
    		TRACE ( "*** Unhandled Exception ***" );
    	}
    
    }
    


  • hat denn niemand eine Idee??



  • Hallo JKuehl,

    ich habe das gleiche Problem. Int-Werte kann ich problemlos auslesen. Beim Auslesen von Strings bekomme ich unsinnige Werte wie -842150451.

    Hast Du schon eine Lösung ?


Anmelden zum Antworten