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

Acriss

Gesperrt
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);
error C2065: 'lpD3DDevice' : undeclared identfier

lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET Clearcolor,0,0);
error C2227: left of '->Clear' must point to class/struct/union

lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET Clearcolor,0,0);
error C2146: syntax error : missing ')' before identifier 'Clearcolor'

lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET Clearcolor,0,0);
error C2059: syntax error : ')'

lpD3DDevice->BeginScene();
error C2227: left of '->BeginScene' must point....

lpD3DDevice->BeginScene();
error C3861: identifier von lpD3DDevice wieder net gefunden

lpD3DDevice->Present(0,0,0,0);
error C2227: blub (->present)

lpD3DDevice->Present(0,0,0,0);
error C3861: Identifier

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?
 
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ß
 
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)
PHP:
// 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 -.-
 
Zuletzt bearbeitet:
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:
C++:
// 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
C++:
LPDIRECT3DDEVICE9 lpD3DDevice = NULL;
Siehe z.B. http://www.jliforum.de/board/viewtopic.php?p=63218&sid=3c8ea44740763408707f13bfca55e63f
Zum Code: (ich nutze mal php, sieht schöner aus oO)
Findest du? :(
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ß
 
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:
C++:
#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));
}
 
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'
Anscheinend steht irgendwo in den Projekteinstellungen oder im Makefile ein Pfad der Leerzeichen enthält aber nicht in Anführungszeichen gesetzt ist.

Gruß
 
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? :D
 
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?
:suchen: 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? :D
:suchen: http://www.google.de/search?hl=de&q=errata&btnI=Auf+gut+Glück!&meta=

Gruß
 
Ok,
hab jetzt die DirectX9 Bibliothek importiert/installiert,
bekomme aber bei folgendem (einfachem)Code einen BuildError,
sonst wird nichts angezeigt:
C++:
#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
g++.exe -c ../SpielC++/main.cpp -o ../SpielC++/main.o -I"C:/Dev-Cpp/include/c++/3.3.1" -I"C:/Dev-Cpp/include/c++/3.3.1/mingw32" -I"C:/Dev-Cpp/include/c++/3.3.1/backward" -I"C:/Dev-Cpp/lib/gcc-lib/mingw32/3.3.1/include" -I"C:/Dev-Cpp/include"

g++.exe ../SpielC++/main.o Startmenü_private.res -o "Startmenü.exe" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/lib/Definitions" -mwindows

g++.exe: Startmen³_private.res: No such file or directory

make.exe: *** [Startmenü.exe] Error 1

Ausführung beendet
 
Zurück