Unbehandelte Ausnahme bei 0x000a1a4f
-
Hallo Community,
bei mir kommt ein sehr merkwürdiger Fehler.
Das Programm unterbricht plötzlich und es kommt eine MessageBox: Unbehandelte Ausnahme bei 0x000a1a4fWieso läuft das Programm nicht normal?
#include <Windows.h> #include <WindowsX.h> #include <d3d11.h> #include <d3dx10.h> #include <d3dx11.h> #pragma comment (lib, "d3d11.lib") #pragma comment (lib, "d3dx10.lib") #pragma comment (lib, "d3dx11.lib") // Globals int iFrameWidth; int iFrameHeight; IDXGISwapChain *swapchain; ID3D11Device *dev; ID3D11DeviceContext *devcon; ID3D11RenderTargetView *backbuffer; // Prototypes LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void InitD3D(HWND hWnd); void RenderFrame(); void CleanD3D(); // Main int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { HWND hWnd; WNDCLASSEX WndClassEx; ZeroMemory(&WndClassEx, sizeof(WNDCLASSEX)); WndClassEx.cbSize = sizeof(WNDCLASSEX); WndClassEx.style = CS_HREDRAW | CS_VREDRAW; WndClassEx.lpfnWndProc = WindowProc; WndClassEx.hInstance = hInstance; WndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW); WndClassEx.hbrBackground = (HBRUSH)COLOR_WINDOW; WndClassEx.lpszClassName = "WindowClass"; RegisterClassEx(&WndClassEx); iFrameWidth = 1280; iFrameHeight = 720; RECT wr = {0, 0, iFrameWidth, iFrameHeight}; AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); hWnd = CreateWindowEx(NULL, "WindowClass", "Programm", WS_OVERLAPPEDWINDOW, 300, 175, wr.right - wr.left, wr.bottom - wr.top, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); MSG msg = {0}; while (TRUE) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if (msg.message == WM_QUIT) { break; } } RenderFrame(); } return msg.wParam; } LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } // Methods void InitD3D(HWND hWnd) { DXGI_SWAP_CHAIN_DESC scd; ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC)); scd.BufferCount = 1; scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; scd.OutputWindow = hWnd; scd.SampleDesc.Count = 4; scd.Windowed = TRUE; D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &scd, &swapchain, &dev, NULL, &devcon); ID3D11Texture2D *pBackBuffer; swapchain -> GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *) &pBackBuffer); dev -> CreateRenderTargetView(pBackBuffer, NULL, &backbuffer); pBackBuffer -> Release(); devcon -> OMSetRenderTargets(1, &backbuffer, NULL); D3D11_VIEWPORT viewport; ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT)); viewport.TopLeftX = 0; viewport.TopLeftY = 0; viewport.Width = iFrameWidth; viewport.Height = iFrameHeight; devcon -> RSSetViewports(1, &viewport); } void RenderFrame() { devcon -> ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f)); // Hier kommt der Fehler swapchain -> Present(0, 0); } void CleanD3D() { swapchain -> Release(); backbuffer -> Release(); dev -> Release(); devcon -> Release(); }
Den Code solltet ihr einfach kompilieren können.
Ich nutze VS 2010 auf Windows 7 im VMWare auf Mac OS X Lion.Könnt ihr mir bitte helfen?
-
Lern deinen Debugger zu benutzen. Wenn es daran scheitert, dann würd ich dir ganz ehrlich davon abraten mit Direct3D rumzuspielen, da es dir offenbar noch an ganz wesentlichen Grundlagen mangelt...
-
Sry, falls ich nicht sofort weis, wie alles funktioniert.
Ich bin mit Objective-C eingestiegen und so ist der Umstieg nicht ganz leicht.
Kannst du mir wenistens einen Tipp geben?
-
Na wenn du bei dieser Message Box auf Break klickst, dann springt der Debugger in die Zeile wo das Problem aufgetreten ist. Das Problem ist vermutlich, dass du in dieser Zeile auf einen ungültigen Zeiger zugreifst...
Trotzdem würd ich dir wirklich sehr dazu raten, C++ sowie den Umgang mit deiner IDE von Grund auf zu lernen.