sto cercando di utilizzare la libreria ADO (msado15.dll) senza usare visualC++

nel caso specifico sto utilizzando devC++ ma potrei anche usarne un'altro, cmq
aggiungo la libreria ai riferimenti del progetto(sarebbe interessante capire come poterlo fare con qualsiasi editor di testo)

ho questo codice di seguito e ottengo in compilazione degli errori del tipo:

_RecordsetPtr non dichiarato; _bstr_t non dichiarato ecc ecc insomma tutti questi identificatori non dichiarati ?? potete darmi qualche suggerimento?
non dovrebbero essere dei tipi definiti all'interno della libreria? forse non la vede?
come posso fare?

codice:
#include <stdio.h>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char* argv[]){
    
    // Inizializzo la libreria COM prima di utilizzare le sue funzioni. 
    CoInitialize(NULL);

    // Costrutto 'try - catch' se si verifica un eccezione (exception) con 'catch' la "catturo"
    try{
	 
    // Dichiaro un puntatore al recordset (utilizzando la tecnologia ADO)
        _RecordsetPtr pRst("ADODB.Recordset");
		
        // Stringa di connessione DSN-Less con un database ACCESS
        //_bstr_t strCnn("DRIVER={Microsoft Access Driver (*.mdb)};UID=;PWD=;DBQ=mio_database.mdb");
        
        // Stringa di connessione con DSN Attivo, valida con tutti i database
        _bstr_t strCnn("Provider=MSDASQL; Data Source=mio_database; Database=mio_database; User Id=; Password=; Security Info=True");
        
        // Query SQL (seleziono tutto il recordset presemte nella tabella)
        pRst->Open("SELECT * FROM mia_tabella;", strCnn, adOpenStatic, adLockReadOnly, adCmdText);
        
        // Muovo il puntatore al recordset sul primo record	 
        pRst->MoveFirst();
        
        // Itero fino alla fine del recordset (<-- totale dei record presenti nella tabella)
        while (!pRst->EndOfFile) {
        
            // Visualizzo a video il campo NOME
            cout<<(char*) ((_bstr_t) pRst->GetFields()->GetItem("nome")->GetValue())<<endl;
            
            // Visualizzo a video il campo COGNOME
            cout<<(char*) ((_bstr_t) pRst->GetFields()->GetItem("cognome")->GetValue())<<endl;
            
            // Visualizzo a video il campo TELEFONO
            cout<<(char*) ((_bstr_t) pRst->GetFields()->GetItem("telefono")->GetValue())<<endl<<endl;
            
            // Muovo il puntatore sul record successivo
            pRst->MoveNext();
        }
        
        // Chiudo connessione al recordset
        pRst->Close();

    }       
    
    // Se si verifica un errore lo catturo
    catch (_com_error &exception){
        
        // ... E lo visualizzo a video (con tanto di descrizione)
        cout<<"Errore: "<<(char*) exception.Description()<<endl;
    
    }
    
    // libero la memoria utilizzata da COM 
    CoUninitialize();
	
    return(0);
	
}