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

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

1

23.12.2009, 17:39

Win32 und .md2

Hallo!
Ich habe mal wieder ein Problem: Ich wollte mal den MD2-Modelloader aus den Tutorials nachschreiben (allerdings für DirectX). Ich schrieb es erstmal (als Test) als Konsolenanwendung. Dort funktioniert auch alles. Jetzt wollte ich es auch endlich als Win32 GUI Anwendung ausprobieren und da kommt jetzt mein Problem: Er kann die .md2-Datei nicht öffnen (also eigentlich schon, doch das Programm stürzt ab :cry: ).
Hier ist die Stelle im Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    CMD2Model* test = NULL;
    switch (message)
    {
        case WM_CREATE:
            test->LoadMD2("test.md2", NULL);
            break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Die Funktion LoadMD2 ist so definiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//*************************************************************************************//

// Ein Modell laden

HRESULT CMD2Model::LoadMD2(const char* pcFileName, IDirect3DDevice9* pD3D)
{
    // Ein Dateizeiger

    FILE* fFile;

    // Die Datei öffnen

    fFile = fopen(pcFileName, "rb");
    if(fFile == NULL) return E_FAIL;

    // Den Dateiheader lesen

    m_pHeader = new MD2_Header;
    fread(m_pHeader, sizeof(MD2_Header), 1, fFile);
    
    // ...


    return S_OK;
}

Hier mal die beiden Projekte mit der Testdatei:
Klick
Ich benutze Code::Blocks mit VC++ 2008 Compiler.
Hat jemand 'ne Idee, wie ich die Dateien auch per Win32 öffnen kann?
Schonmal Danke im Voraus.
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

23.12.2009, 17:53

Eine Konsolenanwendung is genauso eine normale Win32 Anwendung und es gibt eigentlich keinen Grund warum der selbe Code in einer Konsolenanwendung laufen sollte und in einer "normalen" Win32 Anwendung dann nicht.

Zitat von »"Phil239"«

[...] (also eigentlich schon, doch das Programm stürzt ab :cry: ).


Was genau bedeutet das, wo und wie stürzt es ab?

Ich tippe mal auf ein falsches CurrentDirectory. Wann tritt der Fehler auf? Wenn du die exe so startest oder aus der IDE? Liegt die Datei die geöffnet werden soll auch wirklich in dem Verzeichnis wo die exe danach sucht?

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

3

23.12.2009, 17:58

@dot

Zitat

Was genau bedeutet das, wo und wie stürzt es ab?

Das bedeutet, dass Windows anzeigt: "MD2Test.exe hat ein Problem festgestellt und muss beendet werden."

Zitat

Wann tritt der Fehler auf?

Immer wenn ich die Win32 Anwendung starte.

Zitat

Wenn du die exe so startest oder aus der IDE?

Bei beidem.

Zitat

Liegt die Datei die geöffnet werden soll auch wirklich in dem Verzeichnis wo die exe danach sucht?

Ja
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

4

23.12.2009, 17:59

Gibt test->LoadMD2 Denn E_FAIL zurück, oder nicht ?

Probier mal, ob er denn durch irgendeinen Zufall doch den DirectX-Teil der LoadMD2 Funktion ausführt ?

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

5

23.12.2009, 18:01

Also er kommt erst gar nicht so weit bis zum "return". Folglich führt er auch den DirectX-Teil nicht aus. :(
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

23.12.2009, 18:05

Zitat von »"Phil239"«

Zitat

Was genau bedeutet das, wo und wie stürzt es ab?

Das bedeutet, dass Windows anzeigt: "MD2Test.exe hat ein Problem festgestellt und muss beendet werden."


Na dann debugg doch mal...

7

23.12.2009, 18:05

schonmal mit dem debugger durch?

EDIT: Da war einer schneller ;)
Metal ist keine Musik sondern eine Religion.

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

8

23.12.2009, 18:10

Der Fehler wird hier angezeigt:
(MD2.cpp)

C-/C++-Quelltext

1
2
// Den Dateiheader lesen

    m_pHeader = new MD2_Header;


Fehler:

Quellcode

1
Unbehandelte Ausnahme bei 0x00411a69 in MD2CSTest.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000000.
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

23.12.2009, 18:15

Sieht aus als würdest du auf einen Nullpointer zugreifen. Wo steht die fragliche Zeile? Vermutlich in einer Methode die du auf dem ungültigen Objekt aufrufst.

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

10

23.12.2009, 18:16

Hier mal etwas mehr Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//*************************************************************************************//

// Ein Modell laden

HRESULT CMD2Model::LoadMD2(const char* pcFileName, IDirect3DDevice9* pD3D)
{
    // Ein Dateizeiger

    FILE* fFile;

    // Die Datei öffnen

    fFile = fopen(pcFileName, "rb");
    if(fFile == NULL) return E_FAIL;

    // Den Dateiheader lesen

    m_pHeader = new MD2_Header;
    fread(m_pHeader, sizeof(MD2_Header), 1, fFile);
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

Werbeanzeige