Explizit verknüpfte DLL - Basisklassenmember übertragen

  • C++

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Explizit verknüpfte DLL - Basisklassenmember übertragen

    Guten Morgen,

    ich habe eine Frage zum genannten Thema. Es geht um eine Anwendung (.exe), die über die explizite Verknüpfung (GetProcessAddress) auf eine DLL zugreift. Die DLL besitzt eine virtuelle Funktion OnEntry in der Class "TestClass". OnEntry wird über einen Zeiger der TestClass selbst aufgerufen

    C-Quellcode

    1. TestClass* Zeiger;
    2. ...
    3. Zeiger->OnEntry();


    In der cpp der Anwendung kann man diese Funktion (bei der impliziten Verknüpfung) nun nutzen, da sie genau dann aufgerufen wird, wenn irgendwo im Code der DLL auf Zeiger->OnEntry() verwiesen wird.

    In der Anwendung (.exe) selbst vererbe ich einer weiteren Klasse, nennen wir sie mal EXEClass, die TestClass:

    C-Quellcode

    1. class EXEClass : public TestClass //TestClass: From DLL
    2. {
    3. public:
    4. virtual void OnEntry() override {}
    5. }

    Macht man das ganze über die implizite Verknüpfung, so geht das quasi ganz einfach. Die virtuellen Funktionen werden aus der Header-Datei der DLL erkannt.

    Ich frage mich aber, ob man das auch so in der Art über GetProcAddress machen kann. Das ist der umständlichere Weg, aber genau der interessiert mich in diesem Fall. Meine Idee ist, zunächst einen typedef TestClass in der Anwendung zu definieren und diese Klasse samt virtueller Funktionen in der Anwendung niederzuschreiben. Allerdings weiß ich dann nicht, wie ich erkennen soll, ob in der DLL dann Zeiger->OnEntry() ausgeführt wurde.

    Ist das überhaupt möglich was ich da vorhabe? Ich musste das mit den virtuellen Funktionen erst mal richtig verstehen. Die sind quasi nur dazu da, um innerhalb einer anderen Klasse den Aufruf auf eine weitere virtuelle Funktion mit dem selben Namen zu ermöglichen. Weist TestClass* Zeiger eigentlich auf die selbe Adresse wie EXEClass* Zeiger?

    Spoiler anzeigen

    C-Quellcode

    1. //TestClass.h
    2. class TestClass
    3. {
    4. public:
    5. TestClass() {}
    6. virtual void OnEntry() {}
    7. ~TestClass() {}
    8. };
    9. //TestClass.cpp
    10. TestClass* TestClassZeiger;
    11. int Funktion()
    12. {
    13. TestClassZeiger->OnEntry();
    14. }
    15. //EXEClass.h
    16. class EXEClass : public TestClass //Bei der impliziten Verknüpfung sehr einfach zu handhaben, mich würde allerdings interessieren, wie man hier bei expliziten Verknüpfung ansetzen würde
    17. {
    18. public:
    19. EXEClass() {}
    20. virtual void OnEntry() override /* override auch bei der expliziten Verknüpfung möglich? */{};
    21. ~EXEClass() {}
    22. };
    23. //EXEClass.cpp
    24. void EXEClass::OnEntry()
    25. {
    26. //Mach' was!
    27. }
    28. //Main.cpp
    29. EXEClass* EXEClassZeiger;
    30. int main()
    31. {
    32. EXEClassZeiger->OnEntry();
    33. }