Wie stelle ich die STL-Liste über die DLL-Grenze zur Verfügung?

8

Ich habe eine DLL, die auf Daten zugreifen muss, die in STL-Containern in der Host-Anwendung gespeichert sind. Da C ++ keine Standard-ABI hat und ich verschiedene Compiler unterstützen möchte, muss die Schnittstelle zwischen der Anwendung und DLL im Grunde einfach-alte-Daten bleiben.

Für Vektoren ist das relativ einfach. Sie können einfach den Speicherblock des Vektors zurückgeben, da es garantiert ist, dass es sich um einen Vergleich handelt:

%Vor%

Jetzt kann die DLL sicheren Lesezugriff auf die Daten des Vektors über diese Schnittstelle haben. Die DLL kann das auch umschließen, um den Inhalt für sich selbst in einen Vektor zu kopieren.

Was ist mit STL-Listen (und Deques)? Gibt es eine andere direkte Möglichkeit, den Zugriff über eine DLL-Grenze zuzulassen? Oder muss ich auf eine Art GetFirst () / GetNext () Schnittstelle zurückgreifen? Ich muss das vielleicht für eine Menge Listen tun, also wäre es schön, eine so einfache Lösung wie Vektor zu haben.

    
AshleysBrain 10.12.2009, 14:56
quelle

3 Antworten

7

Vielleicht können Sie etwas wie "handles" übergeben, um Iteratoren aufzulisten / zu dequentieren? Diese Handle-Typen wären undurchsichtig und in einer Header-Datei deklariert, die Sie an die Benutzer versenden würden. Intern müssten Sie die Handle-Werte List / Deque-Iteratoren zuordnen. Im Grunde würde der Benutzer Code schreiben wie:

%Vor%     
Nemanja Trifunovic 10.12.2009, 15:23
quelle
10

Sie können STL-Objekte zwischen DLLs übergeben und verschiedene Compiler unterstützen, wenn Sie vorsichtig sind, wo Sie jeden STL-Typ instanziieren. Sie benötigen einige intelligente "DLLEXPORT" -Makros - ich verwende den folgenden Satz, um VC und gcc erfolgreich zu unterstützen.

%Vor%

Wenn Sie Ihre DLL kompilieren, definieren Sie MYDLLLIB_EXPORTS. In der DLL können Sie dann jeden zu verwendenden STL-Typ instanziieren, zum Beispiel Listen oder Vektoren von Strings

%Vor%

Die Benutzer Ihrer DLL (die MYDLLLIB_EXPORTS nicht definiert haben) sehen dann

%Vor%

und verwenden Sie den aus Ihrer DLL exportierten Binärcode, anstatt ihn selbst zu instanziieren.

    
mcdave 11.12.2009 09:49
quelle
1
  

die Schnittstelle zwischen der Anwendung   und DLL muss im Grunde bleiben   Plain-Old-Daten.

Nicht unbedingt. Sie müssen sicher sein, dass die gleiche Compiler-Version verwendet wird. Buildeinstellungen, die sich auf das Layout der STL-Objekte auswirken, sind zwischen DLL und Anwendung identisch.

Wenn Sie das dll in die Wildnis freigeben würden, haben Sie recht damit, STL über dll-Grenzen offenzulegen. Wenn jedoch alles unter Ihrer Kontrolle steht und rein intern ist (oder wenn Sie Build-Einstellungen / Compiler von Drittanbietern streng durchsetzen können), sollten Sie in Ordnung sein.

    
Doug T. 10.12.2009 15:00
quelle

Tags und Links