Dynamische Klassenerzeugung



  • Um Dynamische Klassen zu erzeugen habe ich in meinem Projekt unter VS2003 eine Ausgabe gemacht die mir alle Klassen anzeigt die dynamsich erzeugt werden können.

    Hierzu folgender Code:

    #include "afximpl.h"
    
    CObject *pObj=0;
    
    AFX_MODULE_STATE *pModuleState=AfxGetModuleState();
    AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
    CRuntimeClass *pClass=pModuleState->m_classList;
    
    while(pClass)
    {
      AfxMessageBox((CString)pClass->m_lpszClassName+"\r\n");
      pClass=pClass->m_pNextClass;
    }
    AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
    

    Funktioniert auch so weit. Nun musste ich allerdings das Programm nach VS2008 portieren. Dort findet er aber die Datei afximpl.h nicht mehr. Wo ist die abgeblieben? Was muss ich noch machen?


  • Mod

    afximpl.h kommt von AFX-Implementation!

    D.h. diese Datei ist keine offiziell dokumentierte Datei und kann sich von MFC Version zu MFC Version ändern.

    Entsprechend findet sich diese Datei nicht bei den normalen Headern sondern im MFC Source Verzeichnis.
    C:\Program Files\Microsoft Visual Studio xyz\VC\atlmfc\src\mfc\afximpl.h

    Was jetzt wiederum nicht heißt, dass Dein Code korrekt funktionieren wird, wenn Du die aktuelle Version benutzt...

    BTW: Alle Klassen werden so auch nicht enummeriert.
    Schau Dir den Code in CRuntimeClass::FromName an, Du wirst feststelen, dass es noch MFC-Extension DLLs gibt.



  • Ok. Danke.

    So nun habe ich ein anderes Problem. Und zwar ist meine gesuchte Klasse die ich dynamisch erzeugen will nicht vorhanden. Woran kann das liegen?

    Die Klasse ist ein Dialog. Und Dialoge haben ja wenn man sie mit dem Wizard erzeugt bereits die Makros DECLARE_DYNAMIC und IMPLEMENT_DYNAMIC implementiert. Was muss ich sonst noch machen?


  • Mod

    Nichts!
    Aber Du irrst Dich, wenn Du glaubst, dass es eine Liste aller CObject Klassen gibt.

    In der MFC werden in dieser Liste IMHO nur Klassen verzeichnet, die ein DECLARE_/IMPLEMENT_SERIAL haben. Der Grund ist einfach: Nur diesemüssen enumeriert werden weil man den Namen finden muss.

    Nur für diese Klassen wird das Objekt

    AFX_CLASSINIT _init_##class_name;
    

    erzeugt!



  • Die Liste sollte nur ein Hilfsmittel sein auf der Fehlersuche wieso ich meinen Dialog nicht dynamisch anlegen kann.

    Also meine Frage sollte eigentlich lauten was muss ich machen dass ich diesen Dialog dynamisch anlegen kann?

    Denn hier bekomme ich NULL zurück:

    CDialog* m_dialog =  CRuntimeClass::CreateObject("CMyDlg");
    


  • binärman schrieb:

    Um Dynamische Klassen zu erzeugen habe ich in meinem Projekt unter VS2003 eine Ausgabe gemacht die mir alle Klassen anzeigt die dynamsich erzeugt werden können.
    (...)

    Was du meinst ist dynamisch Objekte erzeugen. Dynamisch Klassen erzeugen geht mit C++ nicht.


  • Mod

    Warum brauchst Du den Namen?
    Du hast doch RUNTIME_CLASS! Und damit hast Du CreateObject.
    Ansonsten kannst Du _SERIAL verwenden.

    Aber wie gesagt: Warum benötigst Du den Namen?



  • Was du meinst ist dynamisch Objekte erzeugen.

    Jo. Richtig.

    Warum brauchst Du den Namen?

    Ich will einer Funktion einen Namen übergeben. Diese Funktion soll dann anhand dieses Namen einer Klasse ein Objekt erzeugen.


  • Mod

    Dann ist _SERIAL der richtige Weg. Damit geht das und Du benötigst nicht mal eine eigene Enumerierung, denn das ist alles schon in CObject in den statischen Membern integriert.

    Weiterhin wilst Du den Objekten vermutlich Eigenschaften mitgeben. Auch in diesem Fall wäre evtl. die Serialisierung von CObject der einfachere Weg.



  • Weiterhin wilst Du den Objekten vermutlich Eigenschaften mitgeben

    Das wäre meine nächste Frage gewesen.

    Du sagst _SERIAL. Darf ich da noch nachfragen was du da genau meinst oder wonach ich da in der Hilfe suchen kann.


  • Mod

    DECLARE_SERIAL/IMPLEMT_SERIAL meinteich. Ich dachte es wäre klar wenn wir über diese Ganzen CObject Konstrukte reden.


Anmelden zum Antworten