# Code::Blocks bringt mich um! Fehler wo gar keiner sein darf/kann



## Acriss (20. Januar 2008)

Hi allerseits

ich ebschäftige mich mit DirectX und habe mir dazu ein Buch ( (c)2006 ) ausgeliehen.
Anbei war eine CD mit verschiedenen Programmen, wie Code::Blocks, Ms Visual 2003, sowie Ms Platform SDK und Ms DirectX SDK 9.

Ich habe den Code aus dem Buch übernommen, sowie die Datei von der CD.
Beides compiliert er nicht, mit einer Vielzahl von Fehlern/sonst irgendwas:


> if(!InitDirect3D(hWnd))
> error C3861 'InitDirect3D': identifier not found, even with argument-dependet lookup
> 
> lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET Clearcolor,0,0);
> ...



Ab dem ersten lpD3D... befindet sich alles in einer witch bei WM_PAINT.
Ich include die Bibliotheken <d3d9.h> und <d3dx9.h>

Kann mir jemand helfen?


----------



## deepthroat (20. Januar 2008)

Hi.

Die Funktion InitDirect3D scheint keine Standardfunktion zu sein. Ist sie irgendwo definiert?

Dann benutzt du eine Variable namens lpD3DDevice die anscheinend auch nirgendwo deklariert ist...

Hinter D3DCLEAR_TARGET fehlt offenbar ein Komma.

Der Code wäre vermutlich ganz hilfreich. Obwohl ich befürchte, dass es etwas viel sein wird... 

Gruß


----------



## Acriss (20. Januar 2008)

Naja es geht so,
also die Funktonen sind denk ich mal in den libarys definiert 
die hab ich auch nach Anleitung ins system integriert. Es wird ja auch nicht gemeckert, das er die nicht findet.

Zum Code: (ich nutze mal php, sieht schöner aus oO)

```
// Dieses Programm zeigt ein einfaches Windows-Programm


// Headerdatei
#include <d3d9.h>
#include <d3dx9.h>

// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);

// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);


// Das Fensterhandle
HWND hWnd = 0;

// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                   HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                   LPSTR lpCmdLine,          // Kommandozeile
                   int nCmdShow)             // Art wie das Fenster angezeigt werden soll
{
    // Fenster erzeugen und Handle speichern
    hWnd = CreateMainWindow(hInstance);

    // Wenn der Rueckgabewert 0 ist, ist ein Fehler aufgetreten
    if(0 == hWnd)
    {
        MessageBox(0, "Fenster konnte nicht erzeugt werden", "Fehler", MB_OK);
        return -1;
    }
    if(!InitDirect3D(hWnd))
    {
        return -1;
    }
	// Struktur, in der Informationen zur Nachricht gespeichert werden
    MSG msg;

    // Diese Schleife laeuft bis die Nachricht WM_QUIT empfangen wird
    while(GetMessage(&msg, NULL, 0, 0))
	{
        // Nachricht an die Callbackfunktion senden
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // Rueckgabewert an Windows
    return 0;
}


HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass =
    {
        sizeof(WNDCLASSEX),                                 // Groesse angeben
        CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile
        MessageHandler,                                     // Callback-Funktion
        0,                                                  // Zusaetzliche Angaben
        0,                                                  // nicht benoetigt
        hInstance,                                          // Anwendungsinstanz
        LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
        LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
        (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weisser Pinsel
        NULL,                                               // kein Menue
        "WindowClass",                                      // Der Name der Klasse
        LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
    };


    RegisterClassEx(&wndClass);

    return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                          "WindowClass",          // Klassenname
                          "DirectXGraphics",        // Fenstertitel
                          WS_OVERLAPPEDWINDOW |   // Fenster
                          WS_VISIBLE,             // Eigenschaften
                          100, 100, 400, 300,     // Anfangsposition und Groesse
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menues
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benoetigt
}


// Diese Funktion wird von Windows aufgrufen, wenn eine Nachricht
// fuer Ihr Programm vorliegt
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    D3DCOLOR Clearcolor = D3DCOLOR_XRGB(0,0,0xff);
    // testen, um welche Nachticht es sich handelt
    switch(msg)
    {
        // wenn das Fenster geschlossen wird, eine Nachricht senden,
        // die das Programm beendet
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        break;
    case WM_KEYDOWN:
        switch(wParam)
        {
            case VK_ESCAPE:
                DestroyWindow(hWnd);
                break;
        }
    break;
    case WM_PAINT:
        lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET, Clearcolor,0,0);
        lpD3DDevice->BeginScene();
        lpD3DDevice->Present(0,0,0,0);
        break;
    }

    // Wenn wir uns nicht um die Nachricht gekuemmert haben
    // wird sie an die Standardnachrichtenverarbeitung von Windows
    // geschickt
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
```

edit: Hab da jetzt mal ein Komma hingesetzt -> Fehlermeldung ist weg, ham die wohl im Buch vergessen -.-


----------



## deepthroat (20. Januar 2008)

Acriss hat gesagt.:


> Naja es geht so,
> also die Funktonen sind denk ich mal in den libarys definiert


Das glaube ich nicht. Sonst wäre die Funktion im MSDN verzeichnet - ist sie aber nicht.

Die Funktion sollte wohl so aussehen:
	
	
	



```
// Direct3D Initialisieren
BOOL Init(HWND hWnd, BOOL bWindowed)
{
// Direct3D-Objekt erzeugen
   lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

   if(NULL == lpD3D)
   {
       // Fehler, D3D-Objekt wurde nicht erzeugt
      return FALSE;
   }
   //Parameter für den Modus festlegen
   D3DPRESENT_PARAMETERS PParams;
   ZeroMemory(&PParams, sizeof(PParams));

   PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
//   PParams.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
   PParams.hDeviceWindow = hWnd;
   PParams.Windowed = bWindowed;
   
   PParams.BackBufferWidth = 512;
   PParams.BackBufferHeight = 512;
   PParams.BackBufferFormat = D3DFMT_A8R8G8B8;

   //Direct3D-Gerät anlegen
   if(FAILED(lpD3D->CreateDevice(
            D3DADAPTER_DEFAULT,
           D3DDEVTYPE_HAL,
           hWnd,
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
           &PParams,
           &lpD3DDevice)))
   {
      // Fehler, kann Gerät nicht anlegen
      return FALSE;
   }
   lpD3DDevice->GetBackBuffer(0,0,
                             D3DBACKBUFFER_TYPE_MONO,
                        &lpBackBuffer);
   return TRUE;
}
```
Die lpD3DDevice Variable sollte vorher deklariert werden
	
	
	



```
LPDIRECT3DDEVICE9 lpD3DDevice = NULL;
```
Siehe z.B. http://www.jliforum.de/board/viewtopic.php?p=63218&sid=3c8ea44740763408707f13bfca55e63f


Acriss hat gesagt.:


> Zum Code: (ich nutze mal php, sieht schöner aus oO)


Findest du? 


Acriss hat gesagt.:


> edit: Hab da jetzt mal ein Komma hingesetzt -> Fehlermeldung ist weg, ham die wohl im Buch vergessen -.-


Evtl. gibt's eine Errata zu dem Buch?

Gruß


----------



## Acriss (20. Januar 2008)

danke
ich setz mich heute abend mal dran, muss jetzt los 

Errata?


----------



## Acriss (21. Januar 2008)

Also,
das ist echt bescheuert...
Bei Google gibt es nur eine Seite die gefunden wird, und da steht keine Antwort -.-


> window.cpp
> Linking executable: StartGame.exe
> LINK : fatal error LNK1181: cannot open input file 'C:\Programme\Microsoft.obj'


Quellcode:

```
#include <d3d9.h>
#include <d3dx9.h>

HWND CreateMainWindow(HINSTANCE hInstance);
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

HWND hWnd = 0;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
{
    hWnd = CreateMainWindow(hInstance);
    if (hWnd == 0)
    {
        MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK | MB_ICONWARNING);
    }
    MSG msg;

    while(GetMessage(&msg,NULL,0,0))
    {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }
    return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass =
    {
        sizeof(WNDCLASSEX),
        CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,
        MessageHandler,
        0,
        0,
        hInstance,
        LoadIcon(NULL, IDI_WINLOGO),
        LoadCursor(NULL, IDC_ARROW),
        (HBRUSH)GetStockObject(WHITE_BRUSH),
        NULL,
        "WindowClass",
        LoadIcon(NULL, IDI_WINLOGO)
    };

    RegisterClassEx(&wndClass);
    return CreateWindowEx(
    NULL,
    "WindowClass",
    "Loading...",
    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    0,0,
    400,300,
    NULL,
    NULL,
    hInstance,
    NULL);
}
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
            break;
    }
    return (DefWindowProc(hwnd,msg,wParam,lParam));
}
```


----------



## deepthroat (21. Januar 2008)

Acriss hat gesagt.:


> Also,
> das ist echt bescheuert...
> Bei Google gibt es nur eine Seite die gefunden wird, und da steht keine Antwort -.-
> 
> ...


Anscheinend steht irgendwo in den Projekteinstellungen oder im Makefile ein Pfad der Leerzeichen enthält aber nicht in Anführungszeichen gesetzt ist.

Gruß


----------



## Acriss (21. Januar 2008)

Naja,
das Problem ist
wenn ich fertige Dateien von der BeispielCD mit dem programm öffne und kompilieren,
dann werden sie kompiliert,
aber wenn ich nur eine Sache verändere, z.b. TRUE auf FALSE setze oder umgekehr, wird es nicht mehr kompiliert, auch wenn ich den Standard herrichte.
Gibt es keine Möglichkeit das ganz mit Dev.C++ zu kompilieren?

Und was ist ein Errata?


----------



## deepthroat (21. Januar 2008)

Acriss hat gesagt.:


> Naja,
> das Problem ist
> wenn ich fertige Dateien von der BeispielCD mit dem programm öffne und kompilieren,
> dann werden sie kompiliert,
> aber wenn ich nur eine Sache verändere, z.b. TRUE auf FALSE setze oder umgekehr, wird es nicht mehr kompiliert, auch wenn ich den Standard herrichte.


Hast du auch die neueste Version von Code::Blocks installiert?


			
				acriss hat gesagt.:
			
		

> Gibt es keine Möglichkeit das ganz mit Dev.C++ zu kompilieren?


 http://www.google.de/search?hl=de&q=dev-c+++direct3d&btnI=Auf+gut+Glück!&meta= 


			
				acriss hat gesagt.:
			
		

> Und was ist ein Errata?


 http://www.google.de/search?hl=de&q=errata&btnI=Auf+gut+Glück!&meta= 

Gruß


----------



## Acriss (22. Januar 2008)

Ok,
hab jetzt die DirectX9 Bibliothek importiert/installiert,
bekomme aber bei folgendem (einfachem)Code einen BuildError,
sonst wird nichts angezeigt:

```
#include <windows.h>

HWND CreateMainWindow(HINSTANCE hInstance);
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

HWND hWnd = 0;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hWnd = CreateMainWindow(hInstance);
    if(hWnd == 0)
    {
        MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
    }
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass = {
        sizeof(WNDCLASSEX),
        CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,
        MessageHandler,
        0,
        0,
        hInstance,
        LoadIcon(NULL, IDI_WINLOGO),
        LoadCursor(NULL, IDC_ARROW),
        (HBRUSH)GetStockObject(WHITE_BRUSH),
        NULL,
        "WindowClass",
        LoadIcon(NULL, IDI_WINLOGO)
    };
    RegisterClassEx(&wndClass);
    
    return CreateWindowEx
    (
    WS_EX_CLIENTEDGE,
    "WindowClass",
    "Loading...",
    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    0,0,
    300,400,
    NULL,
    NULL,
    hInstance,
    NULL
    );
}
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        break;
    }
    return (DefWindowProc(hwnd, msg, wParam, lParam));
}
```

Der KompielerLog meldet folgendes:


			
				KompilerLog hat gesagt.:
			
		

> Compiler: Default compiler
> Building Makefile: "C:\Dev-Cpp\Makefile.win"
> Führt  make... aus
> make.exe -f "C:\Dev-Cpp\Makefile.win" all
> ...


----------



## deepthroat (23. Januar 2008)

Hi.

Du solltest keine Umlaute in den Dateinamen verwenden.

Gruß


----------



## Acriss (23. Januar 2008)

omg
alles klar, hätte ich auch selber drauf kommen müssen -.-

Ich poste das hier auch in diesem Thread, muss ja nicht ständig ein neuer eröffnet werden.

Ich habe nun versucht, erstmal Ein Programm mit DirectX initialisierung zum Laufen zu bringen,
ich bekomme aber Fehler, die ich mir wieder nicht erklären kann 

```
//Fenstererzeugung
//[...]
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        break;
    }
    return (DefWindowProc(hwnd, msg, wParam, lParam));
}
LPDIRECT3D9 lpD3D = NULL;
if(!(lpD3D = Direct3DCreate9(D3D_SDK_VERSION))) //Zeile 67
{
           MessageBox(0,"Fehler beim Erzeugen des Direct3D-Objekts.","Fehler",MB_OK);
}
BOOL InitDirect3D(HWND hWnd)
{
     lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
     if(NULL == lpD3D)
     {
             MessageBox(0,"D3D-Objekt konnte nicht erzeugt werden.","Fehler",MB_OK);
             return FALSE;
     }
     D3DPRESENT_PARAMETERS PParams;
     ZeroMemory(&PParams,sizeof(PParams));
     
     PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
     PParams.hDeviceWindow = hWnd;
     PParams.Windowed = FALSE;
     
     PParams.BackBufferWidth = 800;
     PParams.BackBufferHeight = 600;
     PParams.BackBufferFormat = D3DFMT_A8R8GB8; //Zeile 88
     
     if(FAILED(lpD3D->CreateDevice( //Zeile 90
     D3DADAPTER_DEFAULT,
     D3DDEVTYPE_HAL,
     hWnd,
     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
     &PParams,
     &lpD3DDevice)))
     {
        MessageBox(0,"Fehler, kann Gerät nicht anlegen","Fehler",MB_OK);
        return FALSE;
     }
     return TRUE;
}
void CleanUpDirect3D(void)
{
     if(lpD3DDevice != NULL) //Zeile 105
     {
            lpD3DDevice->Release();
            lpD3DDevice = NULL;
     }
     if(lpD3D != NULL)
     {
              lpD3D->Release();
              lpD3D = NULL;
    }
}
```
In function `BOOL InitDirect3D(HWND__*)': 
Zeile 88 `D3DFMT_A8R8GB8' undeclared (first use this function) 
(Each undeclared identifier is reported only once for each function it appears in.) 

Zeile 90 `lpD3DDevice' undeclared (first use this function) 

In function `void CleanUpDirect3D()': 
105 `lpD3DDevice' undeclared (first use this function) 

[Build Error]  [startseite.o] Error 1 

Ich krieg hier echt ne Weißwurst!

Wäre nett wenn du (oder jmd anders) da auch noch ne antwort drauf weiß(t)


----------



## deepthroat (23. Januar 2008)

\edit: Und wie bereits gesagt müßtest du die Funktion InitDirect3D definieren, und die Variable lpD3DDevice deklarieren. 

Schau dir doch mal den Link an: http://www.jliforum.de/board/viewtopic.php?p=63218&sid=3c8ea44740763408707f13bfca55e63f

Oder such dir ein komplettes Beispielprogramm im Netz. Das ist doch nicht so schwer...

Gruß


----------



## anfängerregnäfna (20. Mai 2009)

Hallo,
Ich hätte vieleicht eine Erklärung für die Fehlermeldungen. Leider habe auch ich Probleme mi Code::Blocks und habe mir deshalb die Beiträge in diesem Forum durchgelesen. Der Quellcode den du angegeben hast, kommt mir bekannt vor. Ich glaube, dass er aus dem Buch "jetzt lerne ich: Spieleprogrammierung mit DirectX" von Christian Roussele stammt. Sollte dies der Fall sein, so musst du wahrscheinlich einfach nur die Header-Datei "Direct3D.h" einbinden. In dieser Datei wurden die Funktionen Init(), Present(), Begin(),......deklariert.
Ich hoffe ich konnte helfen.


----------

