Dynamische Module - wie am schlausten
-
Hallo zusammen,
mich würde mal interessieren ob jemand Erfahrung mit SharedObjects hat. Hintergrund ist folgender:
Ich möchte gerne eine Anwendungen schreiben die modular aufgebaut ist. Die Hauptanwendung soll .so's laden, die in den Konfigurationsdateien angegeben sind. Die Module sollen dann die Möglichkeit haben, sich an verschiedenen stellen "einzuklinken" (z.B. als Funktions-Erweiterung oder als Filter). Natürlich müssen die Module auch Objekte im Hauptprogramm anpacken können.
Hat jemand eine Idee, wie ich das machen könnte oder kennt einer einen guten Link zu Informationen WIE man so etwas am gescheitesten baut? Es geht mir auch nicht um eine "Step-By-Step"-Anleitung sondern wirklich nur um den theoretischen Aufbau.
Würde mich sehr freuen wenn de jemand eine Idee hat.
Gruß,
FunnyDingoPS: Gutes Beispiel für das was ich umsetzten möchte sind die SharedObjects vom Apachen.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Schau Dir mal
http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html
an, koennte weiterhelfen... Ansonsten geht sowas sehr viel
eleganter mit Java - aber wenn Du das wolltest waerst Du ja nicht
in diesem Forum gelandetStefan
-
kingruedi hat mal ein recht nettes kleines Plugin-System zusammengebastelt, schreib den uU mal an.
Wenn Du ihn nicht erreichst, dann sags mir, ich hab das Ding auch noch irgendwo herumliegen.
-
Hi
Ein Beispiel von mir im Rahmen von ChipkartenDabei zeigt die umgebungsvariable CFG auf die XML Datei mit entsprechnden Konfigurationen.
CFile ist ein Wrapper für Datei und Verzeichnishandling (Habe den Source irgendwo hier im C++ Forum gepostet)
Als XML Parser wird die libxml verwendet.
Alle dlls bzw so haben eine Einstiegsfunktion, die mir entsprechende Instance der Klasse liefern. Die Funktion heißt hier GetCardInstance()
LoadDynLib()
wrappt windows und linux funktionen zum nachladen von libraries
Die XML beschreibt auch die dll, bzw. so die geladen werden soll.
CBasicCard* CCardFactory::CreateSmartCard(const CCardID& rclCardId) { const char* xmlFile = getenv("CFG"); if(xmlFile != NULL) { CFile clXMLFile(xmlFile); if(clXMLFile.Exists() && clXMLFile.IsFile()) { CByteBuffer bbHistoricalBytes = rclCardId.GetHistoricalChars(); std::string strCfgFileName = clXMLFile.GetName(); xmlDocPtr doc = xmlParseFile(strCfgFileName.c_str()); xmlNode *root = xmlDocGetRootElement(doc); if(root == NULL || !root->name || xmlStrcmp(root->name, (const xmlChar*)"SecucardConfiguration")) { xmlFreeDoc(doc); return new CBasicCard(rclCardId); } else { for(xmlNode* pCurXMLNode = root; pCurXMLNode != NULL; pCurXMLNode = pCurXMLNode->next) { if(pCurXMLNode->type == XML_ELEMENT_NODE && !xmlStrcmp(pCurXMLNode->name, (const xmlChar*)"SecucardConfiguration")) { pCurXMLNode = pCurXMLNode->children; } else if(pCurXMLNode->type == XML_ELEMENT_NODE && !xmlStrcmp(pCurXMLNode->name, (const xmlChar*)"CardTypes")) { pCurXMLNode = pCurXMLNode->children; } else if(pCurXMLNode->type == XML_ELEMENT_NODE && !xmlStrcmp(pCurXMLNode->name, (const xmlChar*)"Card")) { xmlChar* hatr = xmlGetProp(pCurXMLNode, (const xmlChar*)"HATR"); xmlChar* check = xmlGetProp(pCurXMLNode, (const xmlChar*)"check"); xmlChar* library = xmlGetProp(pCurXMLNode, (const xmlChar*)"load"); CByteBuffer bbCurHistoricalBytes((char*)hatr); typedef CStringTokenizer<char, CIsSeparator<> > tokenizer; tokenizer st((char*)check, strlen((char*)check), ","); int* positions = new int[st.size()]; int counter = 0; tokenizer::iterator it = st.begin(); std::stringstream str; while(it != st.end()) { str << (*it++).data(); str >> positions[counter++]; str.clear(); } bool bCardFound = false; for(unsigned int i = 0; i < st.size(); i++) { if(bbCurHistoricalBytes[positions[i]] != bbHistoricalBytes[positions[i]]) { bCardFound = false; break; } bCardFound = true; } delete[] positions; if(bCardFound) { xmlFreeDoc(doc); DT_HMODULE cardLib = LoadDynLib((char*)library); if(cardLib == NULL) return new CBasicCard(rclCardId); typedef CBasicCard* (*pGetCardInstance)(const CCardID& rclCardId); pGetCardInstance GetCardInstance; GetCardInstance = (pGetCardInstance)GetDynSymbol(cardLib, "GetCardInstance"); if(GetCardInstance == NULL) GetCardInstance = (pGetCardInstance)GetDynSymbol(cardLib, "_GetCardInstance"); return GetCardInstance(rclCardId); } } } xmlFreeDoc(doc); } } } return new CBasicCard(rclCardId); }
Hoffe.
Dies kann dir helfenGrüße
Dimitrij
-
Habe noch vergessen zu sagen.
Die Einstiegsfunktion (Hier GetCardInstance) muss in dem exportiertem code als
extern "C" deklariert und als solche implementiert werden, ansonsten funzt es nicht.