Kann ich pass std::string um eine DLL?
Trennte ich ein code-fragment in einen DLL
denn es wird Häufig aktualisiert, und auf diese Weise sollte es leichter sein, zu implementieren.
Aber ich habe Fragen über das, was ich tun kann und was ich nicht tun kann, mit einem DLL
.
- Kann ich passiere ein
std:string
oder eineCString
zu einemDLL
? - Kann ich übergeben Sie einen Zeiger auf eine
struct
mitstd::string members
und füllen Sie es in eineDLL
? - Kann ein
DLL
gibt einen Zeiger auf ein struct zugewiesen, die es gibt? Wird es gültig? Kann ich es löschen nach? - Was sollte besser zu pass, ein
std::String
oder eineCstring
?
Dank !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie eine Wahl zu machen:
Eng gekoppelt DLL: Die DLL ist gebaut mit den gleichen compiler-version, die Verpackung und die Aufrufkonvention Einstellungen, Bibliothek-Optionen, wie die Anwendung, und beide dynamisch zu verknüpfen, um die Laufzeit-Bibliothek (
/MD
compiler-option). Dadurch können Sie Objekte übergeben hin und her, einschließlich STL-Containern zuordnen DLL-Objekte, die aus der Anwendung heraus, ableiten von Basisklassen in das andere Modul, einfach über alles, was Sie konnte, ohne die Verwendung von DLLs. Der Nachteil ist, dass Sie nicht mehr bereitstellen der DLL unabhängig von der Hauptanwendung. Beides muss gebaut werden, zusammen. Die DLL ist nur zu verbessern, Ihre Prozess-Start-Zeit und die Arbeit eingestellt, weil die Anwendung gestartet werden kann, läuft vor dem laden der DLL (Verwendung der/delayload
linker-option). Die Bauzeiten sind auch schneller als ein single-Modul, vor allem, wenn ganze Programm-Optimierung verwendet wird. Aber die Optimierung erfolgt nicht über die Anwendung-DLL-Grenze. Und jede nicht-triviale ändern, benötigen aber noch den Wiederaufbau sowohl.Lose gekoppelt: Die Anwendung hängt nicht von der Klasse layout von Objekten definiert, die von der DLL. Verwenden Sie nur hoch kompatible Datentypen: einfache Typen, Zeiger, Funktionszeiger, und benutzerdefinierte Typen, der aus diesen Elementen. Klassen Erben von einer Basisklasse definiert Schnittstelle und hat keine Daten-member und nicht-virtuelle Funktionen (dies bedeutet keine Konstruktoren und keine Freigabe der standard-Bibliothek Objekte wie
std::string
oderCString
). Alle Vergabe-und Objekt-Erzeugung erfolgt durch eine factory-Funktion. Speicher werden freigegeben, aus dem Modul, welches ihm zugeteilt. Code und Daten sind getrennt. Die header-Datei explizit fest, die Aufrufkonvention der jede exportierte Funktion und Verpackung jeder Struktur erlaubt modulgrenzen kreuzen. Der Vorteil ist, dass die DLL und die Anwendung aktualisiert werden kann, völlig unabhängig. Sie können neu erstellen mit neuem Laufzeit-Bibliothek, die neue compiler-version, oder sogar in einer ganz neuen Sprache, und nicht einmal berühren die anderen.Ich immer empfehlen die Verwendung der lose gekoppelten Ansatz.
std::string
, aber es ist anders alsstd::string
in der Anwendung. Sie können nicht übergebenstd::string
zwischen Anwendung und DLL, die Sie anstatt passchar*
wie Mark vorgeschlagen.std::string
URI beschädigt ist. Immer noch versuchen, herauszufinden, was ich nun tun soll...std::string
durch Verweis scheint zu funktionieren. Wird die übergabestd::string
durch Verweis immer?Wie meine dll aussetzen Schnittstelle empfangenstd::string &something
und ich sollte in Ordnung sein?std::string
Objekt, aber wenn die compiler-und library-Versionen nicht übereinstimmen zwischen DLL und Anrufer, sogar nur-lese-Operationen kann fehlschlagen, schrecklich.std::unique_ptr
&std::shared_ptr
? Sind Sie sicher, um pass über die Grenzen hinweg? Oder nicht, weil Sie standard-Bibliothek-Typen?std
Arten in diesen Versionen? Und ähnlich ist es mit gcc - seine standard-Bibliothek ABI ist gehalten, mit einer stabilen ABI auch "getauft" - mit Ausnahme von einigen seltenen Ausnahmen, wie diestring
Kuh ändern, das verursacht eine ABI-änderung. Natürlich ist dies alles nicht gewährleistet, die von den C++ - standard und es gibt keine offizielle ABI. Aber es ist ein de-facto-Garantie durch die einzelnen Anbieter. Wie wirkt sich das auf dein Antwort?namespace std
unterliegen immer noch ändern (müssen Sie, weil der C++ standards committee änderungen der Anforderungen), also diejenigen, die noch nicht verwendet werden modulübergreifend.std::string&
als argument in einige öffentliche Funktionen (imwrite, imread,cv::String
ist ein typedef aufstd::string
)? Sie konnte nicht einfach verpassenBesteht die Gefahr bei der übergabe alles in und aus einer DLL, wenn es auf einer Vorlage basiert. Compiler-Optionen kann sich auf die Anordnung des Objekts und eine Vorlage-Klasse nicht beschränkt auf eine einzelne compilation unit; einige verteilt wird Sie an die aufrufende Modul.
Im Falle einer Schnur, die ich weitergeben würde eine
const char *
(oderconst wchar_t *
oderconst TCHAR *
) und führen Sie die Konvertierung zustd::string
oderCString
auf der anderen Seite der Schnittstelle, die innerhalb der DLL.