|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 15.09.2005, 17:25 Titel: C++ Pluginsystem |
|
|
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 |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 15.09.2005, 17:33 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 16.09.2005, 08:03 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 16.09.2005, 18:54 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.09.2005, 19:06 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 16.09.2005, 19:22 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 22.09.2005, 17:05 Titel: |
|
|
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:
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 |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 22.09.2005, 22:44 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 23.09.2005, 07:30 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.09.2005, 09:47 Titel: |
|
|
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 |
|
|
|
|
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
|