pointer / schreibweise erlaubt?

Du bist neu in der Welt von C++? Dann schau hier herein!
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

OK, danke :)...

muss die nach aussen Sichtbare Methode zufällig mit "extern C" deklariert werden??

Blöde Frage am Rande, wie kann die DLL dann auf Dinge, wie zB Datenbankverbindung zugreifen?? Sprich, kann eine DLL auf Objekte der Anwendung zugreifen??

Oder implementiere ich hierfür Methoden wie "Command::setDatabase(*db) usw...?

Bzw. kennt jemand ein gutes Tutorial im Bezug auf DLL?

lG
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Re: pointer / schreibweise erlaubt?

Beitrag von ScyllaIllciz »

Dll's sind doch nichts weiter als eine Ansammlung von Funktionen/Klassen, welche standardisiert zur Verfügung stehen sollen.
Ob ich jetzt eine Klasse anlege mit *.cpp/*.h Dateien oder diese Klasse aus einer Lib heraus benutzt macht keinen Unterschied.
Blöde Frage am Rande, wie kann die DLL dann auf Dinge, wie zB Datenbankverbindung zugreifen?? Sprich, kann eine DLL auf Objekte der Anwendung zugreifen??
Wenn ein Objekt (Instanz einer Klasse) auf eine Datenbank zugreifen soll, dann muss dieses Objekt entweder die Verbindung zur Datenbank selber öffnen oder man übergibt ein vorher geöffnetes Datenbank Objekt. Dabei ist es völlig egal ob die Klasse aus einer Dll kommet oder woanders her. Von der Anwendung/Benutzung her, gibt es keinen Unterschied ob Dll oder Source File Klasse.

Ich hoffe ich habe mich verständlich ausgedrückt ;-)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: pointer / schreibweise erlaubt?

Beitrag von franzf »

Wenn die db schon initialisiert ist, solltest du aus dem Plugin auch mittels QSqlDatabase::database() zugreifen können. Du musst natürlich dein Plugin gegen alle benötigten Libs linken (sollte aber eh klar sein).
Im Zweifel: Ein kleiner Test ist schnell geschrieben.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: pointer / schreibweise erlaubt?

Beitrag von RHBaum »

Dll's sind doch nichts weiter als eine Ansammlung von Funktionen/Klassen, welche standardisiert zur Verfügung stehen sollen.
Ob ich jetzt eine Klasse anlege mit *.cpp/*.h Dateien oder diese Klasse aus einer Lib heraus benutzt macht keinen Unterschied.
Naja, das ist sehr blauaeugig erklärt.
Es gibt unterschiede, die liegen, wie so oft, aber im Detail. Aber dafuer sind oft recht heftig :-)

ne dynamische Bib ziehst an, in dem die Bib, also deren code in nen seperaten speicher lädst. Die exportierten funktionen per FPointer holst, und damit dann anspringst.
mehr kann ne dll nicht.

Nun zu dem "Detail":
Dll sind eigene Übersetzungseinheiten !
Das heisst sie werden seperat gelinkt ...
das heisst, es könnte ein anderer Compiler sein ... der die dll baut
das heisst, es koennten gewisse Flags anders sein (die beim linken einer lib knallen wuerden ... )

Das bringt paar "Probleme" mit sich.
Alle symbole, auf die von Funktions-Deklarationen im Export verwiesen wird, muessen in der dll und in der exe bekannt sein (templates sind da ganz boese z.b.)
Alle Speicherobjecte die in den Funktions-Deklarationen stecken, muessen binaer den gleichen Aufbau haben (da tun sich Objecte (Klassen) etwas schwer ! Methodenausrichtung, lage der Vtable etc ... Deshalb Faustregel, dll mit Klassen Interface immer nur mit selben Compiler bei exe und dll ! Auch wenns ned ganz korrekt ist ... )

Daraus leiten sich eigentlich alle weiteren Probleme ab :-)
Blöde Frage am Rande, wie kann die DLL dann auf Dinge, wie zB Datenbankverbindung zugreifen?? Sprich, kann eine DLL auf Objekte der Anwendung zugreifen??
Geht, mit paar DIngen die beachtet werden muessen.
Die definitionen rund um die Instanz muessen in der dll natuerlich bekannt und auch compatibel sein ...
das symbol muss aus Sicht der Dll als extern deklariert sein (was nicht nur mit dem schluesselwort extern geht). Oder ueber zentrale zugriffsmethoden geleitet werden, die in den Code der exe oder ner anderen dll verweissen und diese wiederum auf ein Object an bestimmter stelle verweissen.

Ciao ...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: pointer / schreibweise erlaubt?

Beitrag von franzf »

Prinzipiell ist die Problematik mit den verschiedenen (inkompatiblen) Compilern (speziell bei C++) klar. Nur denke ich nicht, dass wir HIER damit rechnen müssen.
Es geht um die Vereinfachung der Infrastruktur für Commands, die Plugins werden mit hoher Wahrscheinlichkeit im selben Source-Tarball verteilt, insbesondere werden sie alle mit dem selben Compiler wie das "Hauptprojekt" erstellt.
Das mit den Plugins als separates Binary war auch nur ein Vorschlag, wenn das zu komplex wird (eigene targets definieren, deutlich mehr Source-files) kann man eine ähnliche Infrastruktur mit "eingebauten Plugins" - also feste in die exe einkompilierte Factories - anstellen. Statt dem dicken if-Konstrukt (oder config-files bei den dnamischen Plugins) würde es dann eine statisch gefüllte map<string, CommadnIntefaceFactory*> in einem .cpp geben.

Prinzipiell halte ich aber die Sache mit den dynamischen Plugins für eine gute Übung, weil man etwas mehr von den Möglichkeiten erfährt, und dann evtl. später nochmal darauf zurück greifen kann. Wirklich kompliziert ist es ja auch nicht (wenn man mal weiß, wie man mit seinem Makefile-Generator (qmake, cmake, ...) dlls erzeugen kann).
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: pointer / schreibweise erlaubt?

Beitrag von DBGTMaster »

Hallo,

ich werde mal mit einer statischen Seite anfangen, damit ich mal mit den Grundlagen gut sitze, Umsteigen kann ich ja später, einfach anstatt statisch die factories dann dynmaisch laden...

Aber danke für die Infos!

lG
Antworten