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

1

18.12.2003, 12:53

ne frage zum thema dll.

also ich hab meine engine in eine dll gepackt, wie ja nicht gerade unüblich.
ich kämpfe nur gerad mit ein paar komischen problemen.,....

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifdef DLL
#define FREAKENINE_API __declspec(dllexport)
#else
#define FREAKEINE_API __declspec(dllimport)
#endif

...
class CFreakAGeometry
{
   ...
   FREAKENGINE_API CFreakAGeometry();
   FREAKENGINE_API ~CFreakAGeometry();
   FREAKENGINE_API void Render();
};


wenn ich das so machen, und so hats bisher funktioniert (dachte ich zumindestens.
mitlerweile glaube ich das das der grund war warum mein erster animationstest
bei so vielen nicht funktonierte), dann krieg ich beim starten des programms,
das auf die dll zugreif beim aufruf von bsp. Render ne fehlermeldung,
die sagt "anwendung verknüpft mit fehlendem dll-export: Render"......

die Render funktion ist selbstverständlich nicht im header deklariert sondern
in den entsprechenden cpp-file.:

Quellcode

1
2
3
FREAKENGINE_API void CFreakAGeometry::Render()
{
}


wenn ich die def. spaßeshalber direkt in den header schreib mault er nicht.

lustig ist auch das der konstruktor den ich definiert hab nicht aufgerufen wird.

bitte helft mir das is echt wichtig und vorallem vervig..........thx 23

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

18.12.2003, 13:22

Ist die DLL im selben Verzeichnis wie die EXE bzw. im Projektverzeichnis? Oder in System32?

3

18.12.2003, 13:28

selbes verzeichnis.

aber ich hab mitlerweile glaub ich das problem.

wenn ichs so mach gehts:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
class FREAKENGINE_API CFreakAGeometry
{

  CFreakAGeometry()
  ...
}


FREAKENGINE_API CFreakAGeometry::CFreakAGeometry()
{
}

ich glaub das lag nur daran, dass die zu exportierenden funktionen
in einer nicht exportierbaren klasse definiert waren. zumindest
wenn ich das msdn richtig verstanden hab....

wie is das eigentlich bei deiner engine david.? die is doch sicher auch als dll
realisiert oder.? wie hast du das gemacht mit den klassen ?

4

18.12.2003, 13:38

vielleicht war ich auch etwas voreilig,
der fehler

Quellcode

1
2
3
CFreakCharacter *temp = new CFreakCharacter();
temp->LoadFromFile("asd");
delete temp;


tritt immernoch auf. und zwar beim delete temp;

???????????

5

18.12.2003, 19:20

Hast du deinen Destruktor auch Implementiert? Wenn du ihn Deklarierst aber nicht Implementierst, wird er nicht mehr vom Compiler erzeugt und haste auch das API Makro vor den Destruktor gesetzt?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

6

18.12.2003, 20:49

2*Ja.
ich hab keinen bock mehr.
hab nur noch merkwürdige fehler.
ich bin grad dabei ne neue dll zu bauen
die alten funktionen zu überarbeiten und ein solides debug-modell zu realisieren.

aber eine frage hab ich da noch:

was genau ist der unterschied zwischen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
class API xyz
{
 xyz();
 void Render();
}
und 
class xyz
{
 API xyz();
 API void Render();
}


also compilieren lässt sich beides, nur beim ersten codeschnippsel
mault er, wenn z.b. D3DXMATRIX oder ähnliches als membervariable
von xyz existiert. "D3DXMATRIX benötigt dll-interface".????

7

23.12.2003, 21:52

Zweitere Variante ist mir nicht gelaufig. Erster Variante sagt aus das man die Klasse Exportieren will.

Bei zweiterem weis ich es nicht. Kann mir aber nicht vorstellen, dass das richtig sein soll.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

8

24.12.2003, 00:41

hm...hatte mir schon gedacht das meine methode nicht so ganz "normal" ist
nur, wenn ich class API xyz benutzte
kreig ich beim compilieren immer sowas:

D:\FreakEngine\test2\../FER2/d3dmain.h(47) : warning C4251: 'm_matProj' : struct 'D3DXMATRIX' benoetigt eine DLL-Schnittstelle, die von Clients von class 'CFreakMain' verwendet wird
D:\microsoft visual studio\VC98\INCLUDE\d3dx9math.h(310) : Siehe Deklaration von 'D3DXMATRIX'

kann mir mal wer sagen wie ich nu am beseten meine klasse deklareire?
im moment sieht das z.b. so aus:;

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
class FREAKENGINE_API CFreakMain
{

public:

    static DWORD                m_instances;        //anzahl der erstelleten instanzen

private:

    D3DPRESENT_PARAMETERS       m_d3dpresent;       //device-settings
    D3DXMATRIX                  m_matProj;          //Projektionsmatrix
    D3DXMATRIX                  m_matView;          //Viewmatrix
    D3DDISPLAYMODE              m_d3ddm;            //displaymode

    HWND                        m_hwnd;             //fenster-handle

    DWORD                       m_Width;            //auflösung-breite
    DWORD                       m_Height;           //auflösung-höhe
    DWORD                       m_Bpp;              //auflösung-farbtiefe

    DWORD                       m_LogoId;           //die texture_id des freakenginelogos

    

protected:

public:

    bool                        m_bLogo;            //soll das FE-Logo angezeigt werden:???

    DWORD                       m_BackColor;        //hintergrundfarbe (Clear)

    IDirect3D9                  *m_D3D;             //direct3d-interface
    IDirect3DDevice9            *m_Device;          //direct3ddevice

    DWORD                       m_FPS;              //aktuelle framerate

    CFreakMain();                                   //std.-constructor
    ~CFreakMain();                                  //std.-deconstructor

    IDirect3DDevice9* GetDevice(){return m_Device;};
    void Process();

    //unwichtigeres//
    DWORD Logo();
    //...................

    feResult StartD3D(HWND);        //direct3d initialisieren
    feResult SetMode(DWORD w, DWORD h, DWORD b, bool windowed); //device erstellen und auflösung switchen
    void ClearStates();

    void ListAdapter(const char* = NULL);           //listet alle adapter mit auflösungen auf auf wunsch in datei  

};//class CFreakMain

9

24.12.2003, 21:27

Sieht doch ganz gut aus. Nur nochn kleiner Tippp, sortier mal deine Klasse ein bissel nach public, protected und private.

Die Fehlermeldung bekomm ich auch des oefteren. Allerdings Ignoriere ich die immer und da ich strickt danach handel das ich alle meine Eigenschaften private mache, hab ich auch keine Probleme damit.

Ich weis nicht genau warum die kommt. Es liegt aber schlicht daran das du deine Klasse Exportieren willst er aber fuer die verschiedenen Typen wie z.B. die D3DMATRIX Struktur keine Exportregel finden kann.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige