JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=4dd65b17c775821c1c22b74e225e13caMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Einbinden von DirectX in Visual C++ 2008

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 31.12.2007, 20:52    Titel: Einbinden von DirectX in Visual C++ 2008 Antworten mit Zitat

Code:
1>------ Build started: Project: DirectXGraphics, Configuration: Debug Win32 ------
1>Linking...
1>DirectXGraphics.obj : error LNK2019: unresolved external symbol _Direct3DCreate9@4 referenced in function "int __cdecl InitDirect3D(struct HWND__ *)" (?InitDirect3D@@YAHPAUHWND__@@@Z)
1>C:\Users\Christian Middeldorf\Documents\Visual Studio 2008\Projects\Quelltext\Spieleprogrammierung mit Directx\Kapitel 19\DirectXGraphics\Debug\DirectXGraphics.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Users\Christian Middeldorf\Documents\Visual Studio 2008\Projects\Quelltext\Spieleprogrammierung mit Directx\Kapitel 19\DirectXGraphics\DirectXGraphics\Debug\BuildLog.htm"
1>DirectXGraphics - 2 error(s), 0 warning(s)


Ich benutze das Directx SDK von November diesen Jahres und dazu Visual C++ 2008 Beta3.
Eingebunden habe ich jedenfalls d3d9.h als auch d3dx9.h.
Leider stehen mir im Moment keine weiteren IDE wie z.B Code::Blocks oder Visual C++ 2005, mit denen ich früher gearbeitet habe, zur Verfügung. Somit fällt es mir schwer zu prüfen, ob der Grund des Fehlers eventuel Visual C++ 2008 ist.
Ich hoffe ihr könnt mir behilflich sein.

In poste mal meinen Quellcode:

CPP:
/*Programmname: DirectxGraphics*/


#include <windows.h>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <d3d9.h>
#include <d3dx9.h>

/*Prototypen_Deklaration*/
HWND     CreateMainWindow(HINSTANCE hInstance)               ;
BOOL    InitDirect3D(HWND hWnd)                              ;
void    CleanUpDirect3D(void)                                ;
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,
                        WPARAM wParam, LPARAM lParam);
/*Globale_Variablen*/
HWND hWnd;                            /*Das Handle des Fensters            */
LPDIRECT3D9       lpD3D       = NULL; /*Zeiger auf das Direct3D-Objekt     */
LPDIRECT3DDEVICE9 lpD3DDevice = NULL; /*Zeiger auf das Direct3D-Device     */
LPD3DXFONT        lpD3DFont   = NULL; /*Zeiger auf das Direct3D-Font-Objekt*/

/*Haupt_Programm*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, int nShowCmd)
{
   /*Variablen*/
   MSG  msg ;      /*Die Nachrichten-Struktur*/

   /*Das Fenster, mittels CreateMainWindow(), erzeugen*/
   hWnd = CreateMainWindow(hInstance);

   /*Wenn der Rückgabewert gleich NULL ist, so ist ein */
   /*Fehler aufgetreten*/
   if(NULL == hWnd)
   {
      MessageBox(NULL, "Das Fenster konnte nicht erstellt werden",
                "Fehler", MB_OK);

      return(0);
   }

   if(!InitDirect3D(hWnd))
   {
      /*Fehler beim initialisieren von D3D*/
      return(-1);
   }

   /*Diese Schleife läuft so lange, bist die Nachricht*/
   /*WM_QUIT empfangen wird*/
   while(GetMessage(&msg, NULL, 0, 0))
   {
      /*Nachricht an die Callback_Funktion senden*/
      DispatchMessage(&msg) ;
      TranslateMessage(&msg);
   }

   /*Direct3D-Objekt wieder freigeben*/
   CleanUpDirect3D();

   /*Programm_Beenden*/
   return(0);
}/*WinMain_Funktion*/

/*Funktions_Definition*/
/*CreateMainWindow()*/
/*Funktion: Erzeugt das Haupt-Fenster und gibt ein Hangle zurück*/
HWND CreateMainWindow(HINSTANCE hInstance)
{
   /*Fensterklasse erzeugen*/
   WNDCLASSEX WndClass =
   {
   sizeof(WNDCLASSEX)      ,                  /*Struktur_Größe   */
   CS_DBLCLKS | CS_OWNDC |                    /*Fenster_Stile    */
   CS_HREDRAW | CS_VREDRAW ,
   MessageHandler          ,                  /*Callback_Funktion*/
   0,                                         /*Class_Speicher   */
   0,                                         /*Fenster_Speicher */
   hInstance,                                 /*Anwenungs_Instanz*/
   LoadIcon(NULL, IDI_ERROR),                 /*Windows_Logo     */
   LoadCursor(NULL, IDC_HAND),                /*Normaler_Cursor  */
   (HBRUSH)GetStockObject(BLACK_PEN),         /*Hintergrund_Farbe*/
   NULL,                                      /*Ein_Menü         */
   "WindowClass",                             /*Klassen_Name     */
   LoadIcon(NULL, IDI_EXCLAMATION)            /*Windows_Logo     */
   };

   /*Fensterklasse registrieren, damit sie von CreateWindowEx()*/
   /*verwendet werden kann*/
   RegisterClassEx(&WndClass);

   /*Der Rückgabewert von CreateWindowEx() ist auch der*/
   /*Rückgabewert der Funktion*/
   return(CreateWindowEx
      (
         NULL         ,         /*Erweiterte_Stile     */
         "WindowClass",         /*Klassen_Name         */
         "Ein Fenster",         /*Fenster_Titel        */
         WS_OVERLAPPEDWINDOW |  /*Fenster_Eigenschaften*/
         WS_VISIBLE   ,
         0, 0         ,         /*Fenster_Koordinaten  */
         300, 400     ,         /*Fenster_Größe        */
         NULL,                  /*Parent_Handle        */
         NULL         ,         /*Menü_Hanlde          */
         hInstance    ,         /*Anwendungs_Instanz   */
         NULL                   /*MDI_Anwendung        */
      ));             
}/*CreateMainWindow_Funktion*/

/*CALLBACK()*/
/*Funktion: Behandelt die Nachrichten, die für das Fenster vorliegen*/
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,
                        WPARAM wParam, LPARAM lParam)
{
   /*Lokale_Variablen*/
   D3DCOLOR ClearColor = D3DCOLOR_XRGB(0, 0, 0xFF); /*Farbe zum Füllen des Backpufers*/
   /*Entscheigen, welche Nachricht empfangen wurde*/
   switch(msg)
   {
   case(WM_DESTROY):
      {
         PostQuitMessage(WM_QUIT);
         return(0);
      }break;
   case WM_PAINT:
      {
         /*Puffer mit Blau füllen*/
         lpD3DDevice->Clear(0, 0,
                           D3DCLEAR_TARGET,
                        ClearColor,
                        0, 0);

         lpD3DDevice->BeginScene();
         lpD3DDevice->EndScene()  ;

         lpD3DDevice->Present(0, 0, 0, 0);
      }break;
   }

   return (DefWindowProc(hWnd, msg, wParam, lParam));
}/*CALLBACK_Funktion*/

/*Funktionsname: InitDirect3D          */
/*Funktion     : Initialisiert Direct3D*/
BOOL InitDirect3D(HWND hWnd)
{
   /*Lokale_Variablen*/

   /*Direct3D-Objekt erzeugen*/
   lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

   /*Abfrage nach gültiger Zuweisung*/
   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.hDeviceWindow    = hWnd                 ;
   PParams.Windowed         = TRUE                 ;

   PParams.BackBufferWidth  = 800                  ;
   PParams.BackBufferHeight = 600                  ;
   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);
   }

   /*Programm_Beenden*/
   return(TRUE);
}/*InitDirect3D_Funktiion*/

/*Funktionsname: CleanUpDirect3D                          */
/*Funktion     : Alle erzeugten Direct3D-Objekte freigeben*/
void CleanUpDirect3D(void)
{
   /*Testen, ob die Objekte angelegt wurden und ggf. freigeben*/
   if(NULL != lpD3DDevice)
   {
      lpD3DDevice->Release();
      lpD3DDevice = NULL    ;
   }

   if(NULL != lpD3D)
   {
      lpD3D->Release();
      lpD3D = NULL    ;
   }
}/*CleanUpDirect3D_Funktion*/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 01.01.2008, 12:16    Titel: Antworten mit Zitat

Du musst noch die Librarys eintragen gehe dazu auf Projekt Einstellungen.
Dorten unter Linker Externe Librarys(? Glaub so müsste der Punkt heißen) und dorten musst du die namen von den benötigten Librarys eintragen. Sollte im Buch bzw Tut stehen wie die heißen
_________________

"Die Codeschleuder" das Spieleprogrammierer Magazin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 01.01.2008, 14:14    Titel: Antworten mit Zitat

Ist geschafft. Ich musste es bei Linker->Command Line eintragen.
Danke.
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.01.2008, 15:42    Titel: Antworten mit Zitat

Fruchteis hat Folgendes geschrieben:
Ist geschafft. Ich musste es bei Linker->Command Line eintragen.
Danke.

etwas übersichtlicher ist es, die bei Linker Arrow Input Arrow Additional Dependecies einzutragen

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 01.01.2008, 15:57    Titel: Antworten mit Zitat

Naja ich finde am besten ist es per pragma einzutragen aber egal Wink
Außerdem solange es funktioniert sollte man nicht dran rumbasteln
_________________

"Die Codeschleuder" das Spieleprogrammierer Magazin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 01.01.2008, 15:59    Titel: Antworten mit Zitat

Danke Very Happy
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum