J'ai un projet avec une grande base de code (> 200 000 lignes de code) que je gère ("Le noyau").Substitution/modification de classes C++ à l'aide de DLL
Actuellement, ce noyau dispose d'un moteur de script composé de hooks et d'une classe de gestionnaire de scripts qui appelle toutes les fonctions connectées (enregistrées via DLL) lorsqu'elles se produisent. Pour être tout à fait honnête, je ne sais pas exactement comment cela fonctionne, car le noyau est pour la plupart non documenté et s'étend sur plusieurs années et une ampleur de développeurs (qui sont, bien sûr, absents). Un exemple du moteur de script actuel est:
void OnMapLoad(uint32 MapID)
{
if (MapID == 1234)
{
printf("Map 1234 has been loaded");
}
}
void SetupOnMapLoad(ScriptMgr *mgr)
{
mgr->register_hook(HOOK_ON_MAP_LOAD, (void*)&OnMapLoad);
}
Un fichier supplémentaire nommé setup.cpp
appelle SetupOnMapLoad
avec ScriptMgr
de noyau.
Cette méthode n'est pas ce que je cherche. Pour moi, le moteur de script parfait serait celui qui me permettra de remplacer les méthodes de classe de base. Je veux être en mesure de créer des classes qui héritent des classes de base et d'étendre sur eux, comme ceci:
// In the core:
class Map
{
uint32 m_mapid;
void Load();
//...
}
// In the script:
class ExtendedMap : Map
{
void Load()
{
if (m_mapid == 1234)
printf("Map 1234 has been loaded");
Map::Load();
}
}
Et je veux que chaque instance de Map
à la fois le noyau et des scripts pour être effectivement une instance de ExtendedMap
.
Est-ce possible? Comment?
Je ne veux pas que la source ait 'ExtendedMap' si les scripts ne fournissent pas une telle classe. L'idée est de ré-enregistrer certaines (ou toutes) les classes après les avoir étendues, dans la DLL elle-même. – MoshiBin