Nessuna delle risposte esistenti è corretta: Dato quanto segue su Windows: si hanno due DLL, ognuna delle quali è collegata staticamente con due diverse versioni delle librerie standard C/C++.
In questo caso, non è necessario passare i puntatori alle strutture create dalla libreria standard C/C++ in una DLL all'altra. Il motivo è che queste strutture possono essere diverse tra le due implementazioni di libreria standard C/C++.
L'altra cosa che non si dovrebbe fare è liberare un puntatore allocato da new o malloc da una DLL allocata nell'altra. Anche il gestore di heap può essere implementato diversamente.
Nota, è possibile utilizzare i puntatori tra le DLL: puntano semplicemente alla memoria. È il libero che è il problema.
Ora, potreste scoprire che funziona, ma se lo fa, allora siete solo fortunati. Questo potrebbe causare problemi in futuro.
Una potenziale soluzione al problema è il collegamento dinamico allo CRT. Ad esempio, è possibile collegare dinamicamente a MSVCRT.DLL. In questo modo le DLL utilizzeranno sempre lo stesso CRT.
Nota, suggerisco che non è una buona pratica passare le strutture di dati CRT tra DLL. Potresti voler vedere se riesci a valutare meglio le cose.
Nota, non sono un esperto di Linux/Unix, ma avrete anche gli stessi problemi su quei sistemi operativi.
Capisco i problemi - sto chiedendo risposte a questo problema :) Speravo in una soluzione che non presupponesse di cambiare l'API C esistente (con FILE * nella firma e così via), ma sembra che non ci sia Se non posso garantire tutto per collegare lo stesso runtime C? Sebbene il problema sia teoricamente lo stesso su Unix, raramente è un problema perché esiste un solo runtime C. Non ho mai avuto un singolo problema passando FILE *, i descrittori di file su Unix tra le librerie - un sacco di C APIS sono progettati in questo modo e funzionano perfettamente su quei sistemi operativi. –
Se avere FILE * nella firma dell'API non è una buona pratica, come si gestiscono i flussi di file? Avete bisogno di esportare le funzioni per aprire e chiudere i file se la DLL che chiamate ha alcune funzioni che chiamano internamente fprintf e altre funzioni che si aspettano FILE *? –
Ho suggerito una soluzione :) Non collegare il CRT in modo statico. collegamento a MSVCRT.DLL. Sarei piuttosto sorpreso se tutte le librerie CRT su Linux, Unix o MAC fossero garantite per funzionare in modo impeccabile. Penso che tu sia stato fortunato anche lì. – Foredecker