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

11

01.08.2009, 23:42

Ich brauch echt Hilfe. Egal was ich versuche ich kriege INVALID_CALL. Weiß niemand mehr Rat?

12

01.08.2009, 23:56

Zitat von »"TrikkieMikkie"«

Probiers mal so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//InitDirect3D.h

#ifndef INITDIRECT3D_H
#define INITDIRECT3D_H

extern PDIRECT3D9 g_pD3D; // Deklarationen

extern PDIRECT3DDEVICE9 g_pD3DDevice;

#endif // INITDIRECT3D_H



C-/C++-Quelltext

1
2
3
4
5
6
7
//InitDirect3D.cpp

#include "H:\\Dokumente\\Programmierung\\DirectX\\DirectX_TriBase\\Allgemeines\\InitDirect3D.h"

PDIRECT3D9 g_pD3D = 0; // Definitionen

PDIRECT3DDEVICE9 g_pD3DDevice  = 0;

// CreateDevice etc.



C-/C++-Quelltext

1
2
3
4
//game.cpp

#include "H:\\Dokumente\\Programmierung\\DirectX\\DirectX_TriBase\\Allgemeines\\InitDirect3D.h"

g_pD3DDevice->MachWas(...);


so hab ichs jetzt versucht, da kriege ich aber compiler fehler:

1>game.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""struct IDirect3DDevice9 * device" (?device@@3PAUIDirect3DDevice9@@A)" in Funktion ""public: void __thiscall CGame::DrawMeshContainer(struct _D3DXMESHCONTAINER *,struct _D3DXFRAME *)" (?DrawMeshContainer@CGame@@QAEXPAU_D3DXMESHCONTAINER@@PAU_D3DXFRAME@@@Z)".

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

02.08.2009, 09:06

Hast du deine Variablen auch global definiert oder etwa in einer Funktion drin!?

Btw:

C-/C++-Quelltext

1
#include "H:\\Dokumente\\Programmierung\\DirectX\\DirectX_TriBase\\Allgemeines\\InitDirect3D.h"


Was in Gottes Namen ist das!?

14

02.08.2009, 10:11

Ich benutze die Tribase Engine, und in dieser InitDirect3D wird eben die schnittstelle erstellt. Da die nicht in meinem Projekt direkt liegt, binde ich die so ein.

Die Variable definiere ich in InitDirect3D.h, da gibts keine Funktionen.

15

02.08.2009, 10:21

So hab ichs jetz versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//InitDirect3D.h

#ifdef _INITDIRECT3D_CPP
#undef VAR
#define VAR
#else
#undef VAR
#define VAR extern
#endif

VAR PDIRECT3D9          g_pD3D;
VAR PDIRECT3DDEVICE9    g_pD3DDevice;

#ifndef INITDIRECT3D_H
#define INITDIRECT3D_H
extern PDIRECT3DDEVICE9 device;
#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
//InitDirect3D.cpp

    if(FAILED(hResult = g_pD3D->CreateDevice(pParameters->iAdapter,
                                             pParameters->DeviceType,
                                             hWindow,
                                             pParameters->dwFlags,
                                             &PresentParams,
                                             &g_pD3DDevice)))

PDIRECT3DDEVICE9 device = g_pD3DDevice;


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
//game.cpp

    HRESULT hr = D3DXLoadMeshHierarchyFromX(
    "Data\\Models\\menschen_basis.x",
    D3DXMESH_MANAGED,
    device,
    memoryAllocator,
    NULL,
    &m_frameRoot,
    &m_animController );


Resultat:
game.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""struct IDirect3DDevice9 * device" ....

16

02.08.2009, 10:35

Nachtrag^^:
Deklarieren tue ich die Variable in InitDirect3D.h aber definieren in InitDirect3D.cpp und das tue ich global. Das hatte ich zuerst nicht getan, nun kriege ich zwar keine Compiler Fehler mehr aber D3DXLoadMeshHierarchyFromX liefert D3D_INVALIDCALL.

C-/C++-Quelltext

1
2
3
4
//InitDirect3D.cpp

PDIRECT3DDEVICE9 device = 0; //global


device = g_pD3DDevice; //Das findet allerdings in einer Funktion statt

17

03.08.2009, 10:45

Hat noch jemand nen tip? Ich denke, dass device den wert den es in InitDirect3D.cpp erhält in game.cpp eben nicht mehr hat.


C-/C++-Quelltext

1
device = g_pD3DDevice;


Das findet ja in einer Funktion statt. Ist das das Problem?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

03.08.2009, 13:47

INVALIDCALL heißt einer der Parameter ist ungültig. Wenn es sich dabei um das Device handelt dann vermutlich weil der Pointer 0 is. Das kann viele Gründe haben, unter anderem z.B. dass du die Funktion in der der Device erzeugt wird nicht aufrufst oder dass das Erzeugen fehlschlägt (z.B. aufgrund falscher PRESENT_PARAMETERS).

Ich würd dir mal empfehlen z.B. den Debugger deiner Wahl zu verwendem um herauszufinden ob der Device an der Stelle da eben erzeugt ist oder nicht (also der Pointer 0 ist oder nicht)...

19

03.08.2009, 14:37

also das device erstellen was in der initdirect3d gemacht wird ist schon richtig. das stammt aus der tribase engine. und mein "spiel" startet ja auch und ich kann auch modelle rendern. es geht nur darum das ich quasi ne globale kopie dieses erzeugten devices brauche. kann ich irgendwie testen ob mein verwendetes device ok ist? Vielleicht liegt der InvalidCall ja auch an nem anderen Parameter...

edit: sry das mit dem debugger schon wieder vergessen beim schreiben^^ ok das werd ich mal probieren

20

12.08.2009, 13:03

hm, komischer Weise habe ich ein Problem beim debuggen. Ich benutze den debugger von visual c++ 2008 express und für mein Spiel benutze ich die TriBase engine. Wenn ich nun das debuggen starten will erscheint eine Fehlermeldung: "Error while initiating game". Der Fehler tritt auf wenn folgende Funktion aufgerufen wird:

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
23
24
tbResult CDXTest::Init()
{
    tbResult r;

    //Alles zurücksetzen

    ZeroMemory(this,sizeof(CDXTest));

    //TriBase Engine initialisieren und Konfigurationsdialog aufrufen

    if(tbInit()) return TB_ERROR;
    r = tbDoConfigDialog(&m_Config);
    if(r == TB_CANCELED) return TB_CANCELED;
    else if(r) TB_ERROR("Error while initiating TriBase Engine",r);

    //Laden

    if(Load()) TB_ERROR("Error while loading the game",TB_ERROR);

    //Klassen für Spielzustände erstellen

    m_pMainMenu = new CMainMenu;
    m_pGame     = new CGame;

    //Start = Intro

    SetGameState(GS_MAIN_MENU);
    return TB_OK;
}


So wird die Funktion aufgerufen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    tbResult r = g_pDXTest->Init();
    if(r == TB_CANCELED)
    {
        //Konfigurationsdialog abgebrochen. Programm leise verlassen

        TB_SAFE_DELETE(g_pDXTest);
        return 0;
        }
    else if(r)
    {
        g_pDXTest->Exit();
        TB_SAFE_DELETE(g_pDXTest);
        MessageBox(NULL,"Error while initiating game","Error",MB_OK | MB_ICONEXCLAMATION); //Dieser Fehler wird beim debuggen ausgegeben

        return 1;
    }

Werbeanzeige