Ho una DLL che deve accedere ai dati memorizzati nei contenitori STL nell'applicazione host. Poiché il C++ non ha ABI standard e voglio supportare diversi compilatori, l'interfaccia tra l'applicazione e la DLL deve fondamentalmente rimanere semplice-vecchia-dati.Come esporre l'elenco STL oltre il limite della DLL?
Per i vettori questo è relativamente semplice. Si può semplicemente restituire il blocco di memoria del vettore, perché è garantito per essere contigious:
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
Ora la DLL può avere sicuro accesso in sola lettura ai dati del vettore tramite l'interfaccia. La DLL può anche avvolgere questo per copiare il contenuto in un vettore anche per se stesso.
E per quanto riguarda le liste STL (e gli accessori)? C'è un altro modo semplice per consentire l'accesso tramite un limite DLL? O dovrò ricorrere a qualche tipo di interfaccia GetFirst()/GetNext()? Potrei aver bisogno di farlo per molte liste, quindi sarebbe bello avere una soluzione semplice come quella dei vettori.
Hai ragione che potrei farla franca se tutte le impostazioni di compilazione sono uguali. Ma questo è per un'architettura plugin e mi piacerebbe supportare diversi compilatori. Ho modificato la domanda per chiarire questo. – AshleysBrain
Sono d'accordo con questo, ma forse dovresti sottolineare che non è solo il layout: il codice deve essere stato compilato con la stessa versione del compilatore, in modo che le implementazioni di metodi come new e delete corrispondano. –
Se imponi rigidamente le impostazioni di compilazione/le versioni del compilatore e tutto è sotto il tuo controllo, qual è il vantaggio delle DLL rispetto all'utilizzo di librerie statiche e il collegamento di tutto in un unico eseguibile? –