Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

11

05.07.2004, 16:29

Ist ja klar!
Das ganze System ist eher dafür gedacht, dass man z.B. eine "allgemeine" Renderer-Klasse hat. Das ist die Basisklasse. In der DLL ist dann ein "spezieller" Renderer. Dafür muss die allgemeine Klasse natürlich mit virtuellen Methoden arbeiten, sonst geht es nicht.
Wenn der spezielle Renderer irgendetwas kann, was der Allgemeine nicht kann, dann gibt es immer noch Wege, um das zu realisieren und von außen daraus zuzugreifen.
Z.B. AllgemeinerRenderer::GetSpecialVariable o.ä..

bepo

Frischling

Beiträge: 33

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

12

05.07.2004, 17:44

versteh ich nicht ganz. ???
dass heißt dass ich eine klasse im programm(exe) erstellen muss und dann??

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

13

05.07.2004, 20:13

Zitat von »"bepo"«

versteh ich nicht ganz. ???
dass heißt dass ich eine klasse im programm(exe) erstellen muss und dann??


Also, dann pass mal auf:

Die ganze Sache mit der abgeleiteten Klasse ist nur dann zu was gut, wenn ein Interface vorgeschrieben ist (Basisklasse) und in der DLL dann spezialisiert wird, sodass das Programm die DLL laden kann und ausführen kann, ohne zu "wissen", was passiert, allein mit den "Regeln" der Basisklasse. Der Trick dabei ist ja, dass das Programm dann die Methoden der Basisklasse aufruft, die in der abgeleiteten Klasse überschrieben wurden, sodass die neue Funktionalität genutzt wird (das ist die "Spezialisierung", von der David sprach).
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

bepo

Frischling

Beiträge: 33

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

14

05.07.2004, 21:20

so! des hab ich jetzt kapiert, allerdings bring ich es so nicht zum laufen. jetzt siehts so aus. es kommt immer das BLA anstatt des HALLO! bei 'C->a();'

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* DLL
#include <windows.h>
#include <stdio.h>

extern "C"
{
    class __declspec(dllimport) CLASS
    {   
        public:
            void a() { printf("BLA\n"); }
    };

    class __declspec(dllexport) CLASS_A : public CLASS
    {
        public:
            void a()
            {
                printf("HALLO!\n");
            };
    };

    __declspec(dllexport) CLASS* CreateNewClass()
    {
        return new CLASS_A;
    };
}
------------------------------------------------------------------------*/


// EXE
#include <windows.h>
#include <stdio.h>

class CLASS
{
    public:
        void a() { printf("BLA\n"); }
}; 

HMODULE hDLL = NULL;
CLASS* (__stdcall* pCreateNewClass)() = NULL;

void main()
{
    hDLL = LoadLibrary("dll.dll");
    if(hDLL==NULL) MessageBox(0,"hDLL","Fehler!",MB_OK);

    pCreateNewClass = (CLASS*(__stdcall*)())GetProcAddress(hDLL,"CreateNewClass");
    if(pCreateNewClass==NULL) MessageBox(0,"pCreateNewClass","Fehler!",MB_OK);

    CLASS* C = pCreateNewClass();

    C->a();

    FreeLibrary(hDLL);
};

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

15

05.07.2004, 21:22

Weil Du die Methode "a" nicht virtuell gemacht hast.
Die Klasse muss außerdem gar nicht in den extern "C"-Block und das __declspec-Zeugs kannst Du Dir dabei auch sparen.

bepo

Frischling

Beiträge: 33

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

16

05.07.2004, 21:36

könnte jemand bitte den quelltext oben von mir so editieren, dass es läuft?? ich weiß nicht wo das virtual genau hinkommt ???

und ohne das extern "C" und __declspec kommtn fehler

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

17

05.07.2004, 22:35

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// DLL 

#include <windows.h> 
#include <cstdio> 

class CLASS 
{    
public: 
    virtual void a() {printf("BLA\n");}
}; 

class CLASS_A : public CLASS 
{
public: 
    virtual void a() {printf("HALLO!\n");}
};

extern "C" 
{
   __declspec(dllexport) CLASS* CreateNewClass() 
   { 
        return new CLASS_A; 
   }
} 

// ------------------------------------------------------------------------


// EXE 

#include <windows.h> 
#include <cstdio> 

class CLASS 
{ 
public: 
    virtual void a() {printf("BLA\n");}
}; 

HMODULE hDLL = NULL; 
CLASS* (__stdcall* pCreateNewClass)() = NULL; 

void main() 
{ 
   hDLL = LoadLibrary("dll.dll"); 
   if(!hDLL) MessageBox(0, "hDLL", "Fehler!", MB_OK); 

   pCreateNewClass = (CLASS*(__stdcall*)())GetProcAddress(hDLL,"CreateNewClass"); 
   if(!pCreateNewClass) MessageBox(0, "pCreateNewClass", "Fehler!", MB_OK); 

   CLASS* C = pCreateNewClass(); 
   C->a(); 

   FreeLibrary(hDLL); 
}


Ich hab's getestet, es muss funktionieren.
Achte darauf, wo __declspec, wo extern "C" und wo virtual steht.

bepo

Frischling

Beiträge: 33

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

18

06.07.2004, 13:58

juhuu! es funzt!

danke für die bemühungen :) :)

Werbeanzeige