Hallo an Alle!
D3D10CreateDeviceAndSwapChain <-Diese Funktion macht Probleme
Ja, ich weiß auch, dass das eine Directx-Funktion ist und wir hier im c/c++ Forum sind,
aber es geht garnicht um Directx, sondern allgemein um Visual Studio...
Beim Compilieren meines Codes bekomme ich folgende Fehlermeldung(en):
Ich hab die Directx Libs und die .h's includiert...
MSDN meint:
-Header "D3D10Misc.h" (den ich auch includiert hab)
-Library "D3D10.dll " (mit der ich nichts anzufangen weiß, weil sie ja eigentlich von einer anderen Lib geladen werden sollte, die ich wiederum mit "#pragma comment(lib,"NAME")" eingebunden habe...)
Ich weiß nichmehr weiter, und deshalb frage ich euch: Was mach ich falsch?
Hier ist der gesamte Code, den aber wahrscheinlich keiner braucht, da es ja Directx ist:
D3D10CreateDeviceAndSwapChain <-Diese Funktion macht Probleme
aber es geht garnicht um Directx, sondern allgemein um Visual Studio...
Beim Compilieren meines Codes bekomme ich folgende Fehlermeldung(en):
Code:
main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_D3D10CreateDeviceAndSwapChain@32" in Funktion ""bool __cdecl InitDirectX(void)" (?InitDirectX@@YA_NXZ)".
Ich hab die Directx Libs und die .h's includiert...
MSDN meint:
-Header "D3D10Misc.h" (den ich auch includiert hab)
-Library "D3D10.dll " (mit der ich nichts anzufangen weiß, weil sie ja eigentlich von einer anderen Lib geladen werden sollte, die ich wiederum mit "#pragma comment(lib,"NAME")" eingebunden habe...)
Ich weiß nichmehr weiter, und deshalb frage ich euch: Was mach ich falsch?

Hier ist der gesamte Code, den aber wahrscheinlich keiner braucht, da es ja Directx ist:
Code:
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0)
#include <windows.h>
#include <D3D10.h>
#include <D3DX10.h>
#include <D3D10Misc.h>
#pragma comment (lib, "d3dx10.lib")
#pragma comment (lib, "d3d10.lib")
bool Game_Init(HINSTANCE hInstance);
void Game_Main(void);
void Game_Shutdown(void);
bool InitDirectX();
bool RunWindow();
void ReleaseDirectX(void);
HWND hWnd;
ID3D10Device* gDevice = NULL; //Unser DirectX-Device-Interface
ID3D10RenderTargetView* gRTV = NULL; //Unser RenderTargetView-Interface
IDXGISwapChain* gSwapChain = NULL; //Unser SwapChain-Interface
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg == WM_QUIT) {PostQuitMessage(0); return 0;}
if(msg == WM_CLOSE) {PostQuitMessage(0); return 0;}
if(msg == WM_KEYDOWN && wParam == VK_ESCAPE) {PostQuitMessage(0); return 0;}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
bool RunWindow()
{
MSG msg = {0};
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT)
return false;
DispatchMessage(&msg);
TranslateMessage(&msg);
}
return true;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Game_Init(hInstance);
while(RunWindow())
{
Game_Main();
}
Game_Shutdown();
return 0;
}
bool InitWindow(HINSTANCE hInstance)
{
WNDCLASS wc = {0}; //Die WiNDowCLASS-Struktur initalisieren
wc.hbrBackground = HBRUSH(GetStockObject(BLACK_BRUSH)); //Wie sieht der Hintergrund aus?
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //Was für ein Cursor?
wc.hIcon = LoadIcon(NULL, IDC_ARROW); //Was für ein Icon?
wc.hInstance = hInstance; //Handle auf die Instanz des Programms
wc.lpfnWndProc = WndProc; //Callback-Funktion der Eingaben
wc.lpszClassName = "This is it!"; //Klassenname (wth?)
wc.style = CS_HREDRAW|CS_VREDRAW; //so zeugs.. noch nachschaun wofür (wth?)
RegisterClass(&wc); //Registrieren der Fensterklasse
if(NULL==(hWnd = CreateWindowEx(NULL, //Schlussendlich das Fenster erstellen
wc.lpszClassName, //Klassenname
"That's it!", //Fenstername
WS_VISIBLE|WS_POPUP, //Verschiedene Flags (wth?)
0,0, //Position d. Fensters
GetSystemMetrics(0), //Auflösung Breite
GetSystemMetrics(1), //Auflösung Höhe
NULL, //(wth?)
NULL, //(wth?)
hInstance, //Handle auf die Instanz des Programms
NULL))) //(wth?)
return false;
return true;
}
bool Game_Init(HINSTANCE hInstance){
if(!InitWindow(hInstance)) //Windows-Fenster initalisieren
return false;
if(!InitDirectX()) //DirectX-Zeugs initalisieren
return false;
return true;
}
bool InitDirectX()
{
DXGI_SWAP_CHAIN_DESC dsc = {0}; //Die DirectXGraphicInterface_SWAP_CHAIN_DESCription-Struktur initalisieren
dsc.BufferCount = 1; //Wieviele Buffer?
dsc.BufferDesc.Width = 1920; //Breite des Buffers
dsc.BufferDesc.Height = 1080; //Höhe des Buffers
dsc.BufferDesc.RefreshRate.Denominator = 1; //Nenner der Refreshrate (ist ein Bruch, sechzig eintel)
dsc.BufferDesc.RefreshRate.Numerator = 60; //Zähler der Refreshrate
dsc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; //Farbformat des Buffers, 8Bit each
dsc.Windowed = false; //Fenstermodus?
dsc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; //Zweck des Buffers?
dsc.OutputWindow = hWnd; //Handle des erzeugten Fensters
dsc.SampleDesc.Count = 1; //Kein MultiSampling benutzen
dsc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; //SwapChain soll so effizient wie möglich sein
//Schließlich Device und SwapChain erstellen
if(FAILED(D3D10CreateDeviceAndSwapChain(NULL, //Welche Grafikkarte
D3D10_DRIVER_TYPE_HARDWARE, //Hardware-Driver
NULL, //Wenn Software-Driver, hier Referenz auf Driver-DLL
0, //Flags
D3D10_SDK_VERSION, //SDK-Version
&dsc, //Die SwapChainDesc
&gSwapChain, //Das zukünftige SwapChain-Interface
&gDevice))) //Das zukünftige Device-Interface
return false;
ID3D10Texture2D* BackBuffer = NULL; //Wir erstellen einen Backbuffer
if(FAILED(gSwapChain->GetBuffer(0, //Bufferindex
__uuidof(ID3D10Texture2D), //Typ des bufferverändernden Interfaces
(void**)&BackBuffer))) //Zeiger auf den Backbuffer
return false;
if(FAILED(gDevice->CreateRenderTargetView( //RTV erstellen aus
BackBuffer, //Backbuffer
NULL, //RTVDesc
&gRTV))) //Dem zukünftigen RTV-Interface
return false;
BackBuffer->Release(); //Backbuffer ist im RTV enthalten, also als Element jetzt überflüssig
gDevice->OMSetRenderTargets(1, &gRTV, NULL); //Device mit RTV verbinden
D3D10_VIEWPORT vp = {0}; //D3D10_VIEWPORT-Struktur initalisieren
vp.TopLeftX = 0; //Position des Viewports
vp.TopLeftY = 0; //Position des Viewports
vp.Width = 1920; //Breite des Viewports
vp.Height = 1080; //Höhe des Viewports
vp.MinDepth = 0.0f; //Tiefe des Viewports
vp.MaxDepth = 1.0f; //Tiefe des Viewports
gDevice->RSSetViewports(1, &vp); //Device mit Viewport verbinden
return true; //all right!
}
void Game_Shutdown()
{
ReleaseDirectX(); //DirectX aufräumen
}
void ReleaseDirectX()
{
if(gRTV) gRTV->Release(); //RTV lösen
gSwapChain->SetFullscreenState(false, NULL); //SwapChain auf Fenstermodus schalten (wichtig)
if(gSwapChain) gSwapChain->Release(); //SwapChain lösen
if(gDevice) gDevice->Release(); //Device lösen
}
void Game_Main()
{
gDevice->ClearRenderTargetView(gRTV, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)); //RTV einfärben
gSwapChain->Present(1, 0); //FrontBuffer und BackBuffer tauschen
}