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

Anonymous

unregistriert

1

07.08.2003, 15:35

Window Fehler

Hi, ich hab da nen Fehler, und zwar hab ich versucht Davids InitWindow Funktionen gleich in die Engine Klasse einzubinden mittels SingleTon. Also die Engine Klasse ist ein SingleTon. Ich hab in Bezug auf Windows Progr. noch keine Ahnung, deshalb weiß ich auch nicht so recht den Fehler zu interpretieren.

engine header

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
#include <fstream>
#include <stdio.h>
#include <stdarg.h>
#include <string>
#include <math.h>
#include <Windows.h>
#include <StdIO.h>
#include <Sys\\Stat.h>
#include <Math.h>
#include <D3D9.h>
#include <D3DX9.h>
#include <DXErr9.h>

using namespace std;

/////////////////////////////////////////////////////////////////
// Statuswerte
enum ddResult
{
    DD_OK           = 0,    
    DD_ERROR        = 1,    
};

//Klasse
class DayDreamer{
private:    //Variablen
    static DayDreamer   *m_pInstance;           //Zeiger auf einzige Instanz der Klasse
    static HWND     m_hWindow;          //Handle für Fenster

private:    //Konstruktor
    DayDreamer();
    
public:     //Methoden, Destruktor  
    virtual     ~DayDreamer();                              
    inline static DayDreamer* Instance(){if(m_pInstance == 0) m_pInstance = new DayDreamer(); return m_pInstance;}                          //Zeiger auf einzige Instanz zurückgeben   
    

    //Fensterfunktionen
            InitWindow(int iWidth, int iHeight, char* pcName, HICON hIcon);
            ExitWindow();
    LRESULT WINAPI  WindowProc(HWND hWindow, unsigned int uiMessage, WPARAM WParam, LPARAM LParam);
};


.cpp

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
57
58
59
60
61
62
63
64
#include <DayDreamer.h>


//Initialisieren des Fensters
DayDreamer::InitWindow(int iWidth, int iHeight, char* pcName, HICON hIcon)
{
    // Fensterklassenstruktur ausfüllen
    WNDCLASSEX WindowClass = {sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0, 0,//Hier Fehler
                          GetModuleHandle(NULL), hIcon, NULL, NULL,
                  NULL, "Direct3D window", NULL};

    // Klasse registrieren
    RegisterClassEx(&WindowClass)
    
    // Fenster erstellen und prüfen
    m_hWindow = CreateWindow("Direct3D window",
                        pcName,
                                WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                GetSystemMetrics(SM_CXSCREEN) / 2 - iWidth / 2,
                GetSystemMetrics(SM_CYSCREEN) / 2 - iHeight / 2,
                iWidth,
                iHeight,
                NULL,
                NULL,
                GetModuleHandle(NULL),
                NULL);
}

//Herunterfahren
DayDreamer::ExitWindow()
{
    // Klasse löschen
    UnregisterClass("Direct3D window", GetModuleHandle(NULL));
}

////////////////////////////////////////////////////////////////////////
// Die Nachrichtenfunktion des Fensters
LRESULT WINAPI DayDreamer::WindowProc(HWND hWindow, unsigned int uiMessage, WPARAM WParam, LPARAM LParam)
{
    PAINTSTRUCT Paint;

    switch(uiMessage)
    {
    case WM_CREATE:
        break;

    case WM_PAINT:
        // Das Fenster mit Schwarz füllen
        BeginPaint(hWindow, &Paint);
        FillRect(Paint.hdc, &Paint.rcPaint, (HBRUSH)(GetStockObject(BLACK_BRUSH)));
        EndPaint(hWindow, &Paint);
        break;

    case WM_CLOSE:
        DestroyWindow(hWindow);
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWindow, uiMessage, WParam, LParam);
    }

    return TRUE;
}


Hier die Fehlerausschrift:

Zitat


Temporäre Dateien und Ausgabedateien für "Kapitel2_Bsp1 - Win32 Debug" werden gelöscht.
--------------------Konfiguration: Kapitel2_Bsp1 - Win32 Debug--------------------
Kompilierung läuft...
Bsp2_1.cpp
DayDreamer.cpp
\DayDreamer\DayDreamer.cpp(18) : error C2440: 'initializing' : '' kann nicht in 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' ko
nvertiert werden
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein
\DayDreamer\DayDreamer.cpp(19) : error C2440: 'initializing' : 'struct HINSTANCE__ *' kann nicht in 'int' konvertiert werden
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
\DayDreamer\DayDreamer.cpp(19) : error C2440: 'initializing' : 'struct HICON__ *' kann nicht in 'int' konvertiert werden
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
\DayDreamer\DayDreamer.cpp(20) : error C2440: 'initializing' : 'char [16]' kann nicht in 'struct HICON__ *' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
ddLog.cpp
Fehler beim Ausführen von cl.exe.

Kapitel2_Bsp1.exe - 4 Fehler, 0 Warnung(en)


Danke im voraus.

Anonymous

unregistriert

2

07.08.2003, 15:37

Korrektur

mit "\DayDreamer\DayDreamer.cpp(18) :" ist natürlich das hier gemeint:
\DayDreamer\DayDreamer.cpp( 18 ) :

Anonymous

unregistriert

3

07.08.2003, 15:44

Ach das ist ein Singleton? Eine statische Klasse mit ´nem privaten Konstruktor, der höchstens einmal von der Initialisierungsfunktion aufgerufen wird? Mehr nicht?

Anonymous

unregistriert

4

07.08.2003, 15:46

WndProc

um Dir schnell abzuhelfen, kannst Du die Funktion WindowProc getrost aus Deiner Klassendefinition herausisolieren.
Der Funktionstyp sollte global sein.
Um Dir genauer zu helfen, müßte ich mal nachsehen, was hinter _stdcall steht.

Anonymous

unregistriert

5

07.08.2003, 16:10

Danke für die schnelle Hilfe, ich hab das mal raus genommen, jetzt klappts, aber es erscheint ein neuer Fehler:

Bsp2_1.cpp:

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
#include <DayDreamer.h>
#include "resource.h"


//Render-Funktion
ddResult Render(float fNumSecsPassed)
{
    return DD_OK;
}

//Move-Funktion
ddResult Move(float fNumSecsPassed)
{
    return DD_OK;
}

//Windows-Hauptfunktion
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCmdLine,
                   int iShowCmd)
{
    //Engine initialisieren und Fenster initialisieren
    DayDreamer::Instance()->InitWindow(640, 480, "Beispielprogramm Nr. 2: Fenster",
               LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)));

    //Nachrichtenschleife
    DayDreamer::Instance()->DoMessageLoop(Render, Move);
    
    //Fenster herunterfahren
    DayDreamer::Instance()->ExitWindow();

    //Engine herunterfahren
    DayDreamer::Instance()->~DayDreamer;

    return 0;
}


Zitat


emporäre Dateien und Ausgabedateien für "Kapitel2_Bsp1 - Win32 Debug" werden gelöscht.
--------------------Konfiguration: Kapitel2_Bsp1 - Win32 Debug--------------------
Kompilierung läuft...
Bsp2_1.cpp
DayDreamer.cpp
ddLog.cpp
Linker-Vorgang läuft...
Bsp2_1.obj : error LNK2001: Nichtaufgeloestes externes Symbol "private: static class DayDreamer * DayDreamer::m_pInstance" (?m_pInstance@DayDreamer@@0PAV1@A)
DayDreamer.obj : error LNK2001: Nichtaufgeloestes externes Symbol "private: static struct HWND__ * DayDreamer::m_hWindow" (?m_hWindow@DayDreamer@@0PAUHWND__@@A)
Debug/Kapitel2_Bsp1.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Kapitel2_Bsp1.exe - 3 Fehler, 0 Warnung(en)

Anonymous

unregistriert

6

07.08.2003, 16:40

auweja ;-)

Destruktor aufrufen. Das habe ich nur selten gesehen :-)
Kleiner Tipp.
Diese Funktionen rufst Du doch nur beim Start und Beenden des Programms auf.
Lösche diese Klasse und schreibe die Windows-Funktionen im normalen C-Stil.
Dann klappts auch mit...
Die static-Deklarationen bekommen dann einen ganz anderen Sinn.

Alles andere würde ich auch in Klassen kapseln, aber CreateWin, WinProc und ExitWin nicht.

(nicht böse gemeint)

Anonymous

unregistriert

7

07.08.2003, 19:51

Alles klar, welch dummer Fehler!!!
Ich hab in der cpp die Zeiger auf die Instanz nicht initialisiert. *an den Kopf schlag* Static Varfiablen muss man ja immer initialisieren!!
Den Destruktor rufe ich explizit auf, weil es komischerweise nicht automatisch gemacht wird. Ich habe übrigens die Window Funktionen (Create, Exit) jetzt auch in ne eigene

Klasse gekapselt. :) SingleTon rulez!
Trotzdem Danke für die Hilfe!

Werbeanzeige