Keine der vorhandenen Antworten ist richtig: Angesichts der folgenden unter Windows: Sie haben zwei DLLs, jede ist statisch mit zwei verschiedenen Versionen der C/C++ - Standardbibliotheken verknüpft.
In diesem Fall sollten Sie keine Zeiger auf Strukturen übergeben, die von der C/C++ - Standardbibliothek in einer DLL zur anderen erstellt wurden. Der Grund ist, dass diese Strukturen zwischen den zwei C/C++ - Standardbibliotheksimplementierungen unterscheiden können.
Die andere Sache, die Sie nicht tun sollten, ist ein Zeiger freigegeben von new oder malloc von einer DLL, die in der anderen zugewiesen wurde. Der Heap-Manager kann auch anders implementiert werden.
Hinweis, Sie können die Zeiger zwischen den DLLs verwenden - sie zeigen nur auf Speicher. Es ist die Freiheit, die das Problem ist.
Jetzt können Sie feststellen, dass dies funktioniert, aber wenn es funktioniert, dann sind Sie nur Glück. Dies wird Ihnen in der Zukunft wahrscheinlich Probleme bereiten.
Eine mögliche Lösung für Ihr Problem ist die dynamische Verknüpfung mit der CRT. Beispielsweise könnten Sie dynamisch mit MSVCRT.DLL verknüpfen. Auf diese Weise verwenden Ihre DLLs immer dieselbe CRT.
Hinweis, ich schlage vor, dass es keine bewährte Methode ist, CRT-Datenstrukturen zwischen DLLs zu übergeben. Vielleicht möchten Sie sehen, ob Sie Dinge besser einteilen können.
Hinweis, ich bin kein Linux/Unix-Experte - aber Sie werden die gleichen Probleme auf diesen Betriebssystemen haben.
Ich verstehe die Probleme - ich frage nach Antworten auf dieses Problem :) Ich hatte auf eine Lösung gehofft, die nicht davon ausgeht, bestehende C-API (mit FILE * in der Unterschrift und so weiter) zu ändern, aber es scheint, dass es nicht Wenn ich nicht garantieren kann, dass alles mit der gleichen C-Laufzeit verknüpft ist? Obwohl das Problem unter Unix theoretisch das gleiche ist, ist es selten ein Problem, da es nur eine C-Laufzeit gibt. Ich hatte nie ein einziges Problem mit FILE *, Dateideskriptoren auf Unix zwischen Bibliotheken - viele C APIS sind auf diese Weise entworfen und funktionieren einwandfrei auf diesen Betriebssystemen. –
Wenn FILE * in der Signatur der API keine gute Praxis ist, wie gehen Sie überhaupt mit Dateiströmen um? Müssen Sie die Funktionen exportieren, um die Dateien zu öffnen und zu schließen, wenn die aufgerufene DLL einige Funktionen hat, die intern fprintf und andere Funktionen aufrufen, die FILE * erwarten? –
Ich habe Vorschlag eine Lösung :) nicht statisch mit dem CRT verknüpfen. Verbindung zu MSVCRT.DLL herstellen. Ich wäre ziemlich überrascht, wenn alle CRT-Bibliotheken unter Linux, Unix oder MAC einwandfrei funktionieren würden. Ich denke du warst auch dort glücklich. – Foredecker