JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=7a114ce00bbcaf3870572d5b7d596468Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

C++ Pluginsystem

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 15.09.2005, 17:25    Titel: C++ Pluginsystem Antworten mit Zitat

Hallo, Ich versuche seit geraumer Zeit ein (typesicheres) Pluginsystem zu entwerfen, scheiterte bis jetzt aber immer an einer irgendeiner Hürde.
Wie man DLL's dynamisch zur Laufzeit lädt, weiss ich und es ist auch kein Problem. Also muss ich zunächst erst mal eine DLL-Datei erstellen, welche sich so laden lässt. Hauptproblem hierbei ist der Header, der ja auf beiden Seiten vorhanden sein muss - einmal auf der DLL-Seite und einmal auf der Clientseite, die die DLL ja verwenden möchte. Das Clientprogramm soll aber nur einen Kleinen Teil des Headers sehen, nämlich nur die Dinge, mit denen es arbeiten muss.
Problem 2 ist, dass ich ganz gerne eine Basisklasse "Plugin" anbieten möchte, von der alle Plugins abgeleitet sein sollen. Dies setzt wiederum voraus, dass jedes Plugin diese Basisklasse implementieren muss oder dass ein extra Projekt eine Dll erstellt, welche von den Plugins benutzt werden muss. - Problem: Vererbung innerhalb von verschiedenen Dll's.
Was ich jetzt suche ist also ein Designpattern, mit dem ich Plugins in C++ erzeugen kann und trotzdem typsicher bleibe - eine Nuss, die ich noch nicht geknackt habe.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 15.09.2005, 17:33    Titel: Antworten mit Zitat

Vielleicht hilft dir LunaticSystems :: Documents :: Building a Better Plugin Architecture.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 16.09.2005, 08:03    Titel: Antworten mit Zitat

Sehr guter Artikel. ch bin gerad am durcharbeiten, aber er gefällt mir jetzt schon. Wenn ich Lust und Zeit hab, schreibe ich ein deutsches Tutorial anhand meiner Erfahrungen...
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 16.09.2005, 18:54    Titel: Antworten mit Zitat

Ich wunderte mich immer, dass meine Exportierten Funktionen nie geladen werden konnen (wurden nicht gefunden).
Da erinnerte ich mich an den Dependency Walker und probierte Ihn aus, und siehe da: Die Funktionen wurden Exportiert, aber der Exportname stimmte nicht mehr, so wurde z.B. aus "Funktion" (Meine Testfunktion heisst Funktion im Quelltext) "?Funktion@@YAHXZ" (Der Funktionsname in der Dll, den man z.B. bei GetProcAddress() angeben muss). Da das für mich nicht nachvollziehbar/nutzbar ist, und die DllFunktionen von mir einen richtigen Namen bekommen sollen (bzw. den Namen vom Quelltext behalten sollen) muss es eine Möglichkeit geben, den zu Exportierenden Namen festzulegen.
Hat jemand eine Ahnung, wie ich das machen muss?
PS.: Es muss ja auch eine (versteckte) WinAPI-Funktion geben, mit der man sich alle Funktionsnamen einer Executable enumerieren lassen kann, der Dependency Walker macht ja schliesslich auch nichts anderes?
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 16.09.2005, 19:06    Titel: Antworten mit Zitat

du musst irgendwie C Funktionenen schreiben, wiel C++ die Funktionen wegen der Funktionspolymorphie umbenennt. Also, irgendwie son block machen das das dazwischen C und nciht C++ sein muss.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 16.09.2005, 19:22    Titel: Antworten mit Zitat

Ich probiere mal extern "C" aus, wär einen Versuch wert...
[Edit]
Jup - war richtig.
Woher soll man dass den wissen, in der MSDN wurde kein sterbens Wörtchen darüber verloren...
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}


Zuletzt bearbeitet von AFE-GmdG am 16.09.2005, 19:28, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 16.09.2005, 19:23    Titel: Antworten mit Zitat

hm, jo hab ich mal so in nem Buch gelesen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 22.09.2005, 17:05    Titel: Antworten mit Zitat

Joa - Mein PluginSystem funktioniert zufriedenstellend, aber nun benötige ich mal wieder einen kleinen Denkanstoss:
Und zwar sollen die Plugins nicht (jede für sich selbst) Konfigurationsdateien schreiben - sondern Ihre Konfigurationsdaten an den Kernel geben und von Ihm auf Anfrage (und im Construktor) zurückbekommen. Der Kernel kümmert sich um die Serialisierung.
Dafür wollte ich die Operatoren << und >> überladen.
CPP:
Plugin* pABC=new ABC(..., ConfigValue);
...
ConfigValue Cfg;
// So in etwa Config schreiben
Cfg << pABC;
// So in etwa Config (neu) lesen
Cfg >> pABC;
Nur klappt das nicht so, wie ich mir das vorstelle, weil:
CPP:
class Plugin {...}
ist im Kernel enthalten und rein virtual,
CPP:
class ABC : public plugin {...}
ist in einer Dll, deren Header das Hauptprogramm niemals sieht - Es ist nunmal ein Plugin.
Ich kann die Operatoren nicht in der abstrakten Basisklasse programmieren, weil ich die abgeleiteten Typen der Pluginklasse nicht kenne(n darf).
CPP:
class Plugin {
...
  virtual ConfigValue& operator <<(ABC&) = 0;
}
Und ich kann die Operatoren nicht Global definieren, weil dass dann im ausprogrammierten Plugin geschehen müsste und der Kernel die Operatoren nicht kennt und sich somit nicht kompilieren lässt.
Gibt es eine günstige Lösung für dieses Dilemma?

Kann auch sein, dass ich die Operatorüberladung nicht richtig verstanden habe - aber wie mach ich's dann richtig?
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 22.09.2005, 22:44    Titel: Antworten mit Zitat

Kannst ja sowas machen:

CPP:
void operator<< (ConfigValue& c,Plugin *pp)
{
    pp->GmdC(c);
}


GmdC ist dann eine virtuelle Methode. Der <<-operator ist global definiert.

KA obs klappt, ich habe mich auch kaum mit operatoren beschäftigt.
_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 23.09.2005, 07:30    Titel: Antworten mit Zitat

Oder du lässt von den Operatoren ab und benutzt Methoden zur Serialisierung. Ist denke ich das einfachste.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 23.09.2005, 09:47    Titel: Antworten mit Zitat

Kampfhund hat Folgendes geschrieben:
Kannst ja sowas machen:

CPP:
void operator<< (ConfigValue& c,Plugin *pp)
{
    pp->GmdC(c);
}


GmdC ist dann eine virtuelle Methode. Der <<-operator ist global definiert.

KA obs klappt, ich habe mich auch kaum mit operatoren beschäftigt.

Das Klappt wirklich so. Die virtuelle Methode wird richtig aufgerufen (im Plugin selbst) und den Operator muss ich ja nur im Hauptprogramm erstellen.
Vielen Dank für den Denkanstoss, jetzt komm ich wieder weiter.

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum