DirectX "stürzt ab"

Hallo,
ich bin ein Anfänger in der Programmierung mit DirectX und habe gerade mein erstes Programm geschrieben.
Es soll ein einfaches Dreieck darstellen.
Als IDE habe ich CodeBlocks verwendet, die Kompilierung funktionierte problemlos.
Aber bei der Ausführung meldet sich Windows "Dreieck.exe hat ein Problem festgestellt und muss beendet werden".
Die Datei "TriBase.h" bindet eine 3D Engine ein, die in dem Buch, mit dem ich DirectX lerne verwendet wird. Die Klassen tbVector3 und tbColor stammen aus dieser Engine und stellen einfach einen 3DVektor, bzw. eine Farbe dar.
Auch nach eingehender Suche kann ich den Fehler nicht finden,
hier mein Quellcode
Code:
#include <d3d9.h>
#include<d3dx9.h>
#include <tribase.h>
#include <windows.h>


PDIRECT3D9 g_pd3d=0;
PDIRECT3DDEVICE9 g_pd3ddev=0;
int g_width=1000;
int g_height=1000;
HWND hwnd;               /* This is the handle for our window */
MSG messages;
int g_anzdreiecke=1;
struct SVertex
{tbVector3 vPosition;
tbColor dwColor;
};
SVertex g_tv[3];

init(HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow);
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
void initdx();
void Render();
void Move();
int WINAPI WinMain(HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
init(hThisInstance,hPrevInstance,lpszArgument,nCmdShow);
initdx();
g_pd3ddev->SetRenderState(D3DRS_LIGHTING,FALSE);
g_pd3ddev->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);
g_pd3ddev->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
g_pd3ddev->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
g_pd3ddev->SetRenderState(D3DRS_ZENABLE,TRUE);
g_pd3ddev->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);
g_tv[0].vPosition=tbVector3(1.0f,1.0f,1.0f);
g_tv[1].vPosition=tbVector3(2.0f,1.0f,1.0f);
g_tv[2].vPosition=tbVector3(1.5f,2.0f,1.0f);
g_tv[0].dwColor=tbColor(1.0f,0.0f,0.0f);
g_tv[1].dwColor=tbColor(1.0f,0.0f,0.0f);
g_tv[2].dwColor=tbColor(1.0f,0.0f,0.0f);
while(messages.message!=WM_QUIT){
while(PeekMessage(&messages,NULL,0,0,PM_REMOVE))
{TranslateMessage(&messages);
DispatchMessage(&messages);}
Render();
Move();
}
return 0;
}
init(HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = "szClassName";
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           "szClassName",         /* Classname */
           "Code::Blocks Template Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           g_width,                 /* The programs width */
           g_height,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
ShowWindow (hwnd, nCmdShow);
return 0;};
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
void Render()
{
g_pd3ddev->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(200,200,200),1.0,(DWORD)0.0f);
g_pd3ddev->BeginScene();
g_pd3ddev->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,g_tv,sizeof(g_tv));
g_pd3ddev->EndScene();
g_pd3ddev->Present(NULL,NULL,NULL,NULL);
};
void Move(){};
void initdx()
{
g_pd3d=Direct3DCreate9(D3D_SDK_VERSION);
D3DDISPLAYMODE d;
g_pd3d->GetAdapterDisplayMode(0,&d);
D3DPRESENT_PARAMETERS pParam;
ZeroMemory(&pParam,sizeof(pParam));
pParam.BackBufferWidth=d.Width;
pParam.BackBufferHeight=d.Height;
pParam.BackBufferFormat=d.Format;
pParam.BackBufferCount=1;
pParam.MultiSampleType=D3DMULTISAMPLE_NONE;
//pParam.MultiSampleQuality=1;
pParam.SwapEffect=D3DSWAPEFFECT_COPY;
pParam.hDeviceWindow=hwnd;
pParam.Windowed=TRUE;
pParam.EnableAutoDepthStencil=false;
//pParam.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
pParam.FullScreen_RefreshRateInHz=d.RefreshRate;
pParam.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
g_pd3d->CreateDevice(0,D3DDEVTYPE_HAL,hwnd,D3DCREATE_MIXED_VERTEXPROCESSING,&pParam,&g_pd3ddev);
};
Kann mir jemand helfen?
 
Moin,

die von Dir genannte Fehlermeldung klingt für mich so auf den ersten 'Blick' nach einem Speicherfehler (Zugriffsverletzung etc.).
Versuch mal mit dem Debugger die konkrete Zeile zu ermitteln - dann hat man vlt. 'ne Chance, was dazu zu sagen ...

Gruß
Klaus
 
Vielen Dank für den Tipp,
leider habe ich noch keinen Debugger installiert. Ich nutze visual toolkit 2003. Kann mir vieleicht jemand sagen, wo ich einen Debugger downloaden kann?
 
Hallo,

das Buch habe ich auch.

Ich muss sagen es ist wirklich gut.

Es gibt auch nen Forum zu dem Buch hier. Den Link findeste aber auch im Buch.

Falls du speziell Fragen zum Buch hast kanste dich auch direkt bei mir melden.

So zu deinem Prob:
Downloade auf jeden Fall die neue Version. Die Express version ist ziemlich gut und nen Debuger brauchst du auf jeden Fall sonst kommst du denke ihc mal nicht weit.
Spätestens wenn du deine ersten eigenen kleinen Experimente machst wirds schwierig.

Gruß
Anfänger
 
Diese IDE habe ich auch installiert. Doch trotz (meiner Meinung nach) korrekt eingefügten \include und \lib Dateien gibt vC++ 2008, bei dem gleichen Quellcode folgende Warnung aus
Code:
Kompilieren...
cl : Command line warning D4002 : ignoring unknown option '/errorReport:prompt'
cl : Command line warning D4024 : unrecognized source file type 'ÿþ/', object file assumed
LINK : fatal error LNK1181: cannot open input file ' ?/.obj'
 
Hi.
Diese IDE habe ich auch installiert. Doch trotz (meiner Meinung nach) korrekt eingefügten \include und \lib Dateien gibt vC++ 2008, bei dem gleichen Quellcode folgende Warnung aus
Code:
Kompilieren...
cl : Command line warning D4002 : ignoring unknown option '/errorReport:prompt'
cl : Command line warning D4024 : unrecognized source file type 'ÿþ/', object file assumed
LINK : fatal error LNK1181: cannot open input file ' ?/.obj'
Also irgendwas hast du falsch gemacht. Wo kommen denn die komischen Zeichen her? Woher kommt die /errorReport Option, die der Kompiler eigentlich kennen sollte? (poste mal das BuildLog)

Warum verwendest du denn nicht einfach CodeBlocks wenn du es schon installiert hast und dein Projekt kompilieren konntest? Da gibt es doch auch einen Debug-Modus.

Gruß
 
Hier ist das BuildLog
Code:
Buildprotokoll     Erstellen wurde gestartet: Projekt: "dreick", Konfiguration: "Release|Win32"
 Befehlszeilen     Die temporäre Datei "c:\Dokumente und Einstellungen\Martin Klein\Eigene Dateien\Visual Studio 2008\Projects\dreick\dreick\Release\RSP0000011922724.rsp" wird erstellt. Inhalt:
[
/O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /c /Zi /TP ".\khtd.cpp"
]Erstellen der Befehlszeile "cl.exe @"c:\Dokumente und Einstellungen\Martin Klein\Eigene Dateien\Visual Studio 2008\Projects\dreick\dreick\Release\RSP0000011922724.rsp" /nologo /errorReport:prompt" Ausgabefenster     Kompilieren...
cl : Command line warning D4002 : ignoring unknown option '/errorReport:prompt'
cl : Command line warning D4024 : unrecognized source file type 'ÿþ/', object file assumed
LINK : fatal error LNK1181: cannot open input file ' ?/.obj'
 Ergebnisse     Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Martin Klein\Eigene Dateien\Visual Studio 2008\Projects\dreick\dreick\Release\BuildLog.htm" gespeichert.
dreick - 1 Fehler, 2 Warnung(en)
Außerdem die Liste mit den \include und \lib Anweisungen die ich angegeben habe
Code:
C:\Programme\TriBase\Include
C:\Programme\Microsoft Platform SDK\Include
C:\Programme\Microsoft Visual C++ Toolkit 2003\include
C:\Programme\Microsoft DirectX SDK (March 2009)\Include

C:\Programme\TriBase\Lib
C:\Programme\Microsoft Platform SDK\Lib
C:\Programme\Microsoft Visual C++ Toolkit 2003\lib
C:\Programme\Microsoft DirectX SDK (March 2009)\Lib\x86
 
cl : Command line warning D4002 : ignoring unknown option '/errorReport:prompt'
cl : Command line warning D4024 : unrecognized source file type 'ÿþ/', object file assumed
LINK : fatal error LNK1181: cannot open input file ' ?/.obj'

Moin,

wie deepthroat schon schrieb, sind dies die problematischen Zeilen!

Also, was ist mit dieser '/errorReport:prompt'-Option? Woher kommt sie?
'ÿþ/' und '?/.obj' sieht für mich irgendwie nach Speicherproblemen aus !

Versuch mal im Debugger, die Quelle zu identifizieren !

Gruß
Klaus
 
Hi.

Was hast du denn jetzt installiert?

Ich dachte du verwendest jetzt VS 2008? Warum gibst du denn dann dort die Verzeichnisse vom Visual C++ Toolkit 2003 an? Nimm die Pfade mal raus.

Auch die Pfade vom Plattform SDK mußt du eigentlich nicht angeben, die findet das Studio eigentlich selbst.

Irgendwie sieht es so aus, als würdest du den C/C++ Compiler vom Visual Toolkit mit dem Visual Studio 2008 benutzen? Deinstallier mal das Visual C++ Toolkit 2003.

Gruß

PS: Wenn du debuggen willst, dann solltest du auch im Debug Modus kompilieren (Konfiguration: Debug)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück