Plugins für Programm mittels API
-
Fang ich mal mit der Beschreibung meines Problems an, welches selbst schon schwierig genug scheint:
Ich habe ein laufendes Spiel und möchte nun anderen die Möglichkeit geben, Objekte für das Spiel selbst zu definieren.
Hierfür schwebt mir die Idee von DLL's vor. Soweit so gut.
Nun muss ich natürlich dafür sorgen, dass eine klare Trennung zwischen Spiel und Plugin existiert. Schließlich soll ja nicht jeder zugriff auf die kompletten Sourcen bekommen, nur das sich so eine DLL auch kompilieren lässt.
Hierzu mein Ansatz:Ich habe eine Api.h, die alle Funktionen zur Verfügung stellt, die der User verwendet darf:
class Api { public: void addPoint(int points); };
Diese Header steht dem DLL-Ersteller zur Verfügung und wird dann entsprechend auch includiert. Eine Instanz der API wird für die Einsprungmarke vorgesehen.
etwa so:#include "Api.h" void DLL_EXPORT start(Api *api) { api->addPoint(3); } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { //[...] }
Nun kommt das eigentliche Problem: API-Funktions-Definitionen.
Die kann ich nicht so einfach in einer Api.cpp implementieren, weil ich dann letztendlich gleich alle Header des Programms zur Verfügung stellen kann. Weil bspw. auf ein Objekt Player zugegriffen wird. Davon soll aber niemand was wissen.void Api::addPoint(int points) { // fuer das PlayerObject muesste ich dann widerrum die Playerklasse zur Verfuegung stellen PlayerObject.setPoints(PlayerObject.getPoints() + points); }
Könnte man mit Funktionszeigern irgendwas drehen oder hat jemand einen komplett anderen Ansatz? Ich hoffe, ihr versteht das Problem.
-
Ein Ansatz, der mir gerade noch eingefallen ist, wäre, die Logik umzudrehen.
Ich greife nicht von der DLL auf Funktionen des Programms zu sondern nur vom Programm auf vordefinierte Funktionen <<klingt auch viel sinnvoller:
void DLL_EXPORT start(int &srcPoints) { srcPoints += 3; }
Somit kann der User selbst bestimmen, wieviel Punkte man bekommt, ohne dass er irgendwas vom Programm weiß.
Warum kommt sowas erst dann, wenn man gepostet hat