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

Patrick

Alter Hase

  • »Patrick« ist der Autor dieses Themas

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

24.07.2003, 15:20

DLL, Singleton, operator << und Einsprungspunkt nicht

Hi,

da mir die leute im C++ Forum nicht helfen konnten frag ich mal hier:

kann es irgendwie sein, das Singletons in DLLs die auch in der EXE funktionieren sollen, sich nicht leiden können?

Ich hab nen Singleton in ner DLL (in der DLL funzt er prima!) und will ihn auch in der EXE benutzen, doch da gibbet irgendwie zur laufzeit streit mit ner Error-MessageBox:

Zitat

Test.exe - Einsprungpunkt nicht gefunden
Der Prozedureinsprungpunkt "?setFile@exLog@@QAEXPBD@Z" wurde in der DLL "EagleX.dll" nicht gefunden.


oder ist mein Singleton einfach nur falsch gecodet?

Hier der code:

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
// Dateiname:        EagleX.h 
// ////////////////////////////////////////////////////////////////////////////////// 
// Autor:            Patrick Ullmann                    (c) by Xarent Interactive 2003 
// 
// Erstelldatum:    22.07.2003 
// letzte Änderung:    22.07.2003    (Patrick)    Datei erstellt. 
// ////////////////////////////////////////////////////////////////////////////////// 
// Info:            Header der EagleX Engine 
// ////////////////////////////////////////////////////////////////////////////////// 
 
// M A K R O S ////////////////////////////////////////////////////////////////////// 
#ifdef EAGLEX_EXPORTS 
#define EAGLEX_API __declspec(dllexport) 
#else 
#define EAGLEX_API __declspec(dllimport) 
#endif 
 
// I N C L U D E S ////////////////////////////////////////////////////////////////// 
#include <windows.h> 
#include <d3d9.h> 
#include <d3dx9.h> 
#include <string> 
#include <fstream> 
 
// I N C L U D E S  -  E A G L E _ X //////////////////////////////////////////////// 
#include "exLog.h"

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
// Dateiname:        exLog.h 
// ////////////////////////////////////////////////////////////////////////////////// 
// Autor:            Patrick Ullmann                    (c) by Xarent Interactive 2003 
// 
// Erstelldatum:    22.07.2003 
// letzte Änderung:    22.07.2003    (Patrick)    Datei erstellt. 
// ////////////////////////////////////////////////////////////////////////////////// 
// Info:            Protokollstruktur 
// ////////////////////////////////////////////////////////////////////////////////// 
 
#ifndef _EXLOG_H_ 
#define _EXLOG_H_ 
 
// I N C L U D E S ////////////////////////////////////////////////////////////////// 
    // Noch keine 
 
// D E F I N I T I O N E N ////////////////////////////////////////////////////////// 
    // Noch keine 
 
// S T R U K T U R E N ////////////////////////////////////////////////////////////// 
class EAGLEX_API exLog  
{  
public:  
    static exLog         &getInstance    (void) { return (m_Instance); } 
 
    void setFile (const char *FileName = "Protokoll.txt"); 
 
    exLog& operator<< (const char* s);  
 
private:  
    exLog (void);  
 
    static    exLog    m_Instance; 
 
    std::ofstream    m_Stream;  
    std::string        m_FileName;  
};  
 
 
#endif

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
// Dateiname:        exLog.cpp 
// ////////////////////////////////////////////////////////////////////////////////// 
// Autor:            Patrick Ullmann                    (c) by Xarent Interactive 2003 
// 
// Erstelldatum:    22.07.2003 
// letzte Änderung:    22.07.2003    (Patrick)    Datei erstellt. 
// ////////////////////////////////////////////////////////////////////////////////// 
// Info:            Protokollstruktur 
// ////////////////////////////////////////////////////////////////////////////////// 
 
// I N C L U D E S ////////////////////////////////////////////////////////////////// 
#include <EagleX.h> 
 
// D E F I N I T I O N E N ////////////////////////////////////////////////////////// 
exLog exLog::m_Instance; 
 
// F U N K T I O N E N ////////////////////////////////////////////////////////////// 
exLog::exLog(void)  
{  
}  
 
void exLog::setFile (const char *FileName) 
{ 
    this->m_FileName = FileName; 
    this->m_Stream.open (this->m_FileName.c_str(), std::ios::out);  
 
    this->m_Stream << "Protokolldatei:\n\n"; 
 
    this->m_Stream.close ();  
} 
 
exLog& exLog::operator<< ( const char* s )  
{     
    this->m_Stream.open (this->m_FileName.c_str(), std::ios::out | std::ios::app);  
    this->m_Stream << s;  
    this->m_Stream.close ();  
 
    return (*this);  
}


was ist falsch? Ich kapier das vorne und hinten nicht mehr wieso der Singleton sich net mit der DLL verträgt :( der ist doch richtig... :(

2

25.07.2003, 00:19

Hmm...ist zwar nicht direkt ein Fehler, aber deine getInstance Methode sollte nicht als Inline Deklariert sein. Mach es lieber so

Quellcode

1
2
3
4
5
exLog& exLog::getInstance()
{
  static exLog log;
  return log;
}
und schmeis deine m_Instance Member raus. Dann sollte ein Aufruf wie

Quellcode

1
exLog::getInstance().setFile("file.txt")
sowohl in der DLL als auch in der EXE Funktionieren. Das Inlineing könnte hier evetl. Probleme verursachen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Patrick

Alter Hase

  • »Patrick« ist der Autor dieses Themas

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

25.07.2003, 08:31

hi, daran lags net, irgendwie wurde in der exe EAGLEX_EXPORTS definiert (frag mich net wie). naja funzt nun, achja: Getinstance als inline? wo?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

25.07.2003, 09:33

Klingt für mich so, als ob Du einfach nur vergessen hast, die aktuelle Version Deiner DLL in das Verzeichnis zu kopieren, wo die EXE liegt bzw. ins Projektverzeichnis der Anwendung, die auf die DLL zugreift.
Am einfachsten ist es, wenn Du die DLL automatisch nach dem Kompilieren von MSVC++ ins Windows\System32-Verzeichnis kopieren lässt.

Patrick

Alter Hase

  • »Patrick« ist der Autor dieses Themas

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

5

25.07.2003, 10:04

nee sonst käm ne error-meldung :"Dll nicht gefunden!" und nicht einsprungspunkt :D

Tracert

Treue Seele

Beiträge: 108

Wohnort: Braunschweig

Beruf: Student

  • Private Nachricht senden

6

25.07.2003, 11:39

Nicht wenn die DLL schon existiert, nur halt noch in einer veralteten Version...

TR

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

25.07.2003, 13:31

Zitat von »"Patrick"«

nee sonst käm ne error-meldung :"Dll nicht gefunden!" und nicht einsprungspunkt :D

Wie Tracert schon meinte. Ich schrieb: die aktuelle Version. Das ist mir auch oft passiert. Wenn ich was an der Engine ändere (was "Gravierendes" wie z.B. andere Parameter bei einer Funktion) und ein Programm, das noch mit der alten Version kompiliert wurde, wird ausgeführt, dann kommt die Meldung auch. Er sucht ja dann noch nach der alten Funktion und findet sie nicht.

8

25.07.2003, 15:12

Zitat

achja: Getinstance als inline? wo?
Eine Methode die in der Klassendeklaration Definiert ist, wird als inline Interpretiert.

Quellcode

1
2
3
4
5
6
7
8
class exLog
{
public:
  exLog& getInstance() { return m_Instance; }

private:
 static exLog m_Instance;
}

Wenn man eine Funktion in einer Header Definiert und nicht als inline Deklariert und in mehreren Modulen einfügt, wird der Compiler eine Fehlermeldung ausspucken, wie etwa "Funktion XY wurde bereits in Modul XY Definiert!". Das gilt auch für Methoden.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Shark_3D

Treue Seele

Beiträge: 311

Wohnort: Hannover

Beruf: Schüler

  • Private Nachricht senden

9

29.07.2003, 13:12

@David Also bei mir ist es ZITAT:Ein ganz dummer Fehler, Und jetzt ist es normal wie *wütend sei* (Ob hier jetzt ein :) steht???)
"Immer die doppelte Menge"
(Kaufmannsregel Nr.355 von der Lehrkassette 3)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

29.07.2003, 15:09

??? Mit einem "dummen Fehler" meine ich nicht, dass der, der ihn gemacht hat, dumm ist. Ein dummer Fehler ist für mich so eine blöde Kleinigkeit, an die man garnicht denkt.

Werbeanzeige