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

04.11.2010, 22:00

CreateConsoleScreenBuffer und SetConsoleActiveScreenBuffer schlagen fehl

Hey Leute,
ich versuche gerade ein kleines Spielchen zu programmieren und das ganze in der guten alten Konsole :P
Nun, ich hab mich in den vergangenen Tagen informiert und bin auf die Funktionen der Überschrift gestoßen. In meiner ersten "Rohfassung" hat auch alles gut funktioniert. Nur wurde nach tausendfachen Einfügen von Code hier und da alles so unübersichtlich, dass ich (was ich eh vor hatte) gerade dabei bin den ganzen Code ein wenig zu strukturieren und in Klassen zu packen (am Anfang war einfach alles in der main :D). In Objektorientierung bin ich allerdings noch nicht so geübt.
Jetzt ist die Initialisierung von meinem Konsolenbuffer in der Klasse CFramework und zwar als Funktion Init(). Diese rufe ich in der Klasse CGame mit der Memberfunktion CGame::Init() auf. Diese wird in der main-Funktion aufgerufen. Dank der schönen Fehlerabfrage erfahre ich allerdings, dass sowohl das Erstellen des Buffers, als auch folglich das diesen als aktiven Buffer festlegen scheitert.
Ich hoffe alles ist verständlich, bin für jede Hilfe seeeeehr dankbar :)

Hier die Klasse CFramework:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef FRAMEWORK_HPP
#define FRAMEWORK_HPP

#include <windows.h>
#include <iostream>

class CFramework
{
public:
    void Init();
private:
    HANDLE hStdOut, hBuff;
};
#endif


Der Code dazu:

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
#include "Framework.hpp"

void CFramework::Init()
{
    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    hBuff = CreateConsoleScreenBuffer (
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        CONSOLE_TEXTMODE_BUFFER,
        NULL);
    if (hBuff = INVALID_HANDLE_VALUE)
    {
        std::cout << "Creating Buffer failed" << std::endl;
        exit(-1);
    }
    if (!SetConsoleActiveScreenBuffer(hBuff))
    {
        std::cout << "Setting active screen buffer failed" << std::endl;
        exit(-1);
    }
}


Zur Sicherheit noch der Aufruf in Game::Init():

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void CGame::Init()
{
    m_pPlayer = new CPlayer;

    m_pFramework = new CFramework;
    m_pFramework->Init();

    m_bGameRun = true;
}


und in der main:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include "Game.hpp"

int main ()
{
    CGame Game;
    Game.Init();
    Game.Run();
    Game.Quit();
    return 0;
}


Tut mir Leid für den vielen Code, aber ich möchte nichts Vergessen. Gemecker am (bisher sichtbaren) Code ist natürlich erlaubt und willkommen ;)

Ein paar Daten zum Abschluss:
Compiler: Microsoft Visual C++ 6.0 (ich weiß veraltet, aber ich mags :D)
System: Windows Vista

Sollte ich was vergessen haben, bitte melden. Nochmal herzlichen Dank im Voraus :)
Diese Angaben sind (wie immer) ohne Gewähr :D

2

05.11.2010, 22:46

Hat keiner eine Idee? :( Oder liegts an einer ungenauen Beschreibung oder Details, bitte sagen, wenn ja.
Diese Angaben sind (wie immer) ohne Gewähr :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

05.11.2010, 22:50

Versuch mal ob du mit GetLastError() eine genauere Fehlerbeschreibung bekommst...

4

06.11.2010, 00:37

Ok, stimmt, hätte ich posten sollen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
    hBuff = CreateConsoleScreenBuffer (
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        CONSOLE_TEXTMODE_BUFFER,
        NULL);

    if (hBuff = INVALID_HANDLE_VALUE)
    {
        std::cout << "Creating Buffer failed " << GetLastError() << std::endl;
        exit(-1);
    }


Ausgabe:

Zitat

Creating Buffer failed 0
Beim nachschauen der Errorcodes auf http://msdn.microsoft.com/en-us/library/ms681382(VS.85).aspx kommt jetzt bei mir nur noch mehr Verwunderung auf, da 0 der Code für success ist ?(
Hab ich jetzt total gefailed und GetLastError() falsch benutzt? :P

Danke erstmal Dot :)
Hoffe jemand kann damit was anfangen..
Diese Angaben sind (wie immer) ohne Gewähr :D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Akktta« (06.11.2010, 09:36)


5

06.11.2010, 10:17

Du weist in deiner if - Abfrage den Wert INVALID_HANDLE_VALUE zu.

C-/C++-Quelltext

1
2
3
4
5
6
if (hBuff = INVALID_HANDLE_VALUE) // <- Mach mal hBuff == ...
    {
        std::cout << "Creating Buffer failed " << GetLastError() << std::endl;
        exit(-1);
    }
    


Du vergleichst die Werte nicht miteinander sondern weist einen neuen Wert zu, du vergleichst 2 Werte miteinander wenn du "==" benutzt. Natürlich ohne die Anführungszeichen ^^
Mfg Male

6

06.11.2010, 10:24

Oh Gott ist das peinlich :whistling:
Was für ein dummer Fehler, man, danke Male, geht jetzt.
Das mir sowas nur passieren kann und dann auch noch nicht auffällt :rolleyes:
Fail :D
Diese Angaben sind (wie immer) ohne Gewähr :D

7

07.11.2010, 14:07

Hast du schon Ausnahmebehandlung kennengelernt? Dann bau das mal entsprechend ein und lass das nicht in der Game-Klasse.
c-tor & d-tor haben übrigens meistens nen Sinn ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

8

09.11.2010, 21:29

Hm, meinst du mit Ausnahmebehandlung Fehlerabfrage?
Und c-tor und d-tor interpretier ich jetzt mal als Konstruktoren und Destruktoren.. Glaub mir, ich hab welche, aber eigentlich definiere ich dort nur meine Variablen.. Dachte es wäre übersichtlicher, wenn man sieht, dass was initialiesiert wird.. werds dann mal fixen ;)
Diese Angaben sind (wie immer) ohne Gewähr :D

Werbeanzeige