C++ [Visual]DirectDraw Fehler

Registriert
Dez. 2009
Beiträge
213
Hi,
ich wollte mal bischen DirectX programmieren und da erst mal mit DirectDraw anfangen. Leider habe ich schon beim initialisieren Probleme...

Ich verwende folgendes Tutorial:
http://www.codeworx.org/directx_tuts.php

Und das ist mein erster Gehversuch mit DirectX:

Code:
#include <windows.h>
#include <ddraw.h>

#define titel "MusterGui"
#define windowclass "DDWinClass"

LONG FAR WINAPI WndProc (HWND , UINT , UINT , LONG);

LPDIRECTDRAW7 lpDirectDraw;
HRESULT ddrval;


int WINAPI WinMain (HINSTANCE hInstance, 
					HINSTANCE hPrevInstance, 
					LPSTR lpCmdLine, 
					int nCmdShow)
{


	MSG msg ;
	HWND hwnd ;
	WNDCLASS wndclass ;
	
	if (!hPrevInstance)
	{
      wndclass.style = CS_HREDRAW | CS_VREDRAW ;
      wndclass.lpfnWndProc = WndProc ;
      wndclass.cbClsExtra = 0 ;
      wndclass.cbWndExtra = 0 ;
      wndclass.hInstance = hInstance ;
      wndclass.hIcon = LoadIcon (NULL , IDI_APPLICATION) ;
      wndclass.hCursor = LoadCursor (NULL , IDC_ARROW) ;
      wndclass.hbrBackground = (HBRUSH)GetStockObject (LTGRAY_BRUSH) ;
      wndclass.lpszMenuName = NULL ;
      wndclass.lpszClassName = windowclass ;
      RegisterClass (&wndclass) ;
	}



	hwnd = CreateWindow (windowclass ,
	titel ,
	WS_OVERLAPPEDWINDOW ,
	CW_USEDEFAULT ,
	CW_USEDEFAULT ,
	CW_USEDEFAULT ,
	CW_USEDEFAULT ,
	NULL , NULL ,
	hInstance , NULL) ;
	ShowWindow (hwnd , nCmdShow) ;
	UpdateWindow (hwnd) ;

	ddrval = DirectDrawCreateEx(NULL, (VOID**)&lpDirectDraw,    IID_IDirectDraw7, NULL);
	if (ddrval != DD_OK)
	{
		return (0);
	}

	ddrval = lpDirectDraw->SetCooperativeLevel (hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
	if (ddrval != DD_OK)
	{
		lpDirectDraw->Release();
		lpDirectDraw = NULL;
		return (0);
	}

	ddrval = lpDirectDraw->SetDisplayMode (640, 480, 8, 0, 0);
	if (ddrval != DD_OK)
	{
		lpDirectDraw->Release();
		lpDirectDraw = NULL;
		return (0);
	}

	while(1)
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			if (msg.message == WM_QUIT) break;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	if (lpDirectDraw != NULL)
	{
		lpDirectDraw->Release();
		lpDirectDraw = NULL;
	}

	return msg.wParam ;

}

LONG FAR WINAPI WndProc (HWND hwnd , UINT message ,
                         UINT wParam , LONG lParam)
{
   switch (message)
   {
      case WM_DESTROY:
      {
         PostQuitMessage (0) ;
         return 0 ;
      } break;
   }
   return DefWindowProc (hwnd , message , wParam , lParam) ;
}

Leider kommen immer diese Fehlermeldungen:
--------------------Konfiguration: projekt1 - Win32 Debug--------------------
Kompilierung läuft...
Program.cpp
E:\programmierung\software\Microsoft Visual Studio\MyProjects\projekt1\Program.cpp(10) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'lpDirectDraw'
E:\programmierung\software\Microsoft Visual Studio\MyProjects\projekt1\Program.cpp(10) : error C2501: 'LPDIRECTDRAW7' : Fehlende Speicherklasse oder Typbezeichner
E:\programmierung\software\Microsoft Visual Studio\MyProjects\projekt1\Program.cpp(10) : fatal error C1004: Unerwartetes Dateiende gefunden
Fehler beim Ausführen von cl.exe.

projekt1.exe - 3 Fehler, 0 Warnung(en)

Was mach ich falsch?
 
Du bist Dir ganz sicher dass es LPDIRECTDRAW7 ist ? Wenn ja fehlt irgendein Header oder #define...

schau dir mal die Deklaration an.
 
Hast du auch die Ordner mit den Header- und Lib-Dateien deinem Visual Studio bekannt gemacht? Von alleine weiß der nämlich leider nicht, wo diese zu finden sind.
 
Das Tutorial da ist schon was älter. LPDIRECTDRAW7 stammt aus einer alten Version von DirectX (7 eben ^^) und ist wahrscheinlich auf deinem Windows nicht mehr drauf.

Gemäß MSDN sollte es mit LPDIRECTDRAW (ohne Nummer) gehen. Wenn nicht, such nach einem aktuellen Tutorial :)
 
@NullPointer: Es ist genau umgekehrt: IDirectDraw hieß es seit DirectX 1, mit DirectX 7 wurde das erweiterte Interface IDirectDraw7 eingeführt. Und da DirectDraw danach nicht mehr aktualisiert wurde, ist IDirectDraw7 bis heute das aktuellste.
 
Ach so. Dann tut es mir leid, daß ich Blödsinn erzählt habe xD

Anderer Lösungsvorschlag, C&P aus einem anderen Forum:
Hast du die Pfade für Includes und Libraries für das DirectX SDK im Visual Studio nach ganz oben geschoben?
Sonst kann es passieren, dass du eine ältere ddraw.h includiert bekommst, die LPDIRECTDRAW7 noch nicht kennt.
 
Die letzte Antwort sieht sehr gut aus. Werde ich mal ausprobieren...
Ergänzung ()

OK, das hat mir weitergeholfen. Ich musste den Eintrag ganz nach oben schieben.
Doch jetzt check ich gar nichts mehr. Jetzt zeigt der mir einen Fehler in der winnt.h Headderdatei an. Ganz sicher, da habe ich nichts daran rumgepfuscht!

Ich zeige hier mal die Fehlermeldung und einen Ausschnitt der Headerdatei:

Fehler:
Code:
--------------------Konfiguration: projekt1 - Win32 Debug--------------------
Kompilierung läuft...
Program.cpp
c:\programme\microsoft platform sdk\include\winnt.h(222) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'PVOID64'
c:\programme\microsoft platform sdk\include\winnt.h(222) : fatal error C1004: Unerwartetes Dateiende gefunden
Fehler beim Ausführen von cl.exe.

projekt1.exe - 2 Fehler, 0 Warnung(en)

Und hier die Headerdatei:
Code:
#define PRAGMA_DEPRECATED_DDK 1
#endif
#else
#define DECLSPEC_DEPRECATED_DDK
#define PRAGMA_DEPRECATED_DDK 1
#endif
#else
#define DECLSPEC_DEPRECATED_DDK
#define PRAGMA_DEPRECATED_DDK 0
#endif

//
// Void
//

typedef void *PVOID;
typedef void * POINTER_64 PVOID64;  //Hier wird der Fehler angezeigt!


#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define NTAPI __stdcall
#else
#define _cdecl
#define NTAPI
#endif

//
// Define API decoration for direct importing system DLL references.
//

#if !defined(_NTSYSTEM_)
#define NTSYSAPI     DECLSPEC_IMPORT
#define NTSYSCALLAPI DECLSPEC_IMPORT
#else
[/CODE]
Ergänzung ()

Ok, jetzt habe ich noch mal was probiert:
Ich habe die veraltete ddraw.h aus dem Standart-Includeverzeichnis entfernt und konnte jetzt wieder den Verweis des DX SDK Verzeichnisses ganz nach unten setzen, jetzt kennt er trotzdem noch LPDIRECTDRAW7 und in der Haederdatei kam kein Fehler. Doch jetzt kommt ein anderer Fehler wegen angeblichen unaufgelösten externen Verweisen! ???????

Fehler:
Code:
--------------------Konfiguration: projekt1 - Win32 Debug--------------------
Linker-Vorgang läuft...
Program.obj : error LNK2001: Nichtaufgeloestes externes Symbol _DirectDrawCreateEx@16
Program.obj : error LNK2001: Nichtaufgeloestes externes Symbol _IID_IDirectDraw7
Debug/projekt1.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

projekt1.exe - 3 Fehler, 0 Warnung(en)

Was muss ich tun, damit das endlich funktioniert?
Ergänzung ()

OK, hat sich erledigt. Trotzdem vielen Dank für eure Antworten. Ich habe einfach vergessen, das auch für die Biblitotheksverweise und Quellcodeverweise einzutragen.
 
Zurück
Oben