C++ 渲染函数c+处的访问冲突+;directx9
//------------------------问题结束了-------------------------------C++ 渲染函数c+处的访问冲突+;directx9,c++,visual-studio-2010,render,access-violation,directx-9,C++,Visual Studio 2010,Render,Access Violation,Directx 9,//------------------------问题结束了------------------------------- #include <Windows.h> #include <d3dx9.h> #include <sstream> #include <string> void initD3D(HWND hWnd); void Render(); void cleanD3D(); LPDIRECT3D9 d3d ; LPDIRECT3
#include <Windows.h>
#include <d3dx9.h>
#include <sstream>
#include <string>
void initD3D(HWND hWnd);
void Render();
void cleanD3D();
LPDIRECT3D9 d3d ;
LPDIRECT3DDEVICE9 d3ddev;
LRESULT CALLBACK MainWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam, LPARAM lParam)
{
switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
HWND mainWnd;
WNDCLASSEX wndClassData;
memset(&wndClassData, 0x00, sizeof(wndClassData));
wndClassData.cbSize = sizeof(wndClassData);
wndClassData.style = CS_CLASSDC;
wndClassData.lpfnWndProc = MainWindowProc;
wndClassData.hInstance = hInstance;
wndClassData.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClassData.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndClassData.lpszClassName="ColourMatchingWindow";
RegisterClassEx(&wndClassData);
mainWnd = CreateWindowEx(NULL,
"wndClass",
"ColourMatching",
WS_OVERLAPPEDWINDOW,
100,100,
800,600,
GetDesktopWindow(),
NULL,
hInstance,
NULL);
ShowWindow(mainWnd, nCmdShow);
initD3D(mainWnd);
MSG msg;
for(;;){
while(PeekMessage(&msg, NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message==WM_QUIT)
break;
Render();
}
cleanD3D();
UnregisterClass("ColourMatchingWindow", hInstance);
return 0;
}
void initD3D(HWND hWnd){
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DDISPLAYMODE displayMode;
d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode);
D3DPRESENT_PARAMETERS d3dpp;
memset(&d3dpp, 0, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = displayMode.Format;
d3dpp.BackBufferCount = 1;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);
}
void Render(){
d3ddev->Clear(0, NULL, (D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER),
D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}
VS2010在render()上给了我关于访问冲突的错误消息,我试着调试代码,意识到错误可能是由d3ddev没有分配到正确的值引起的,但是我很困惑为什么没有分配到正确的值,以及它背后的逻辑是什么?我原以为只要调用了CreateDevice(),就会创建d3ddev,但这不是出于某些原因。但是在上面的代码中,
d3ddev
在哪里初始化?我假设在我再次声明它时,它会自动初始化。不会的。是因为CreateWindowEx没有正确初始化吗?很可能就是这样。查看传递给CreateWindowEx的windows类字符串名称与您刚刚完成注册的windows类字符串名称。CreateWindowEx的第一个参数应该是“ColorMatchingWindow”
;不是“wndClass”
。从那开始。作为记录,检查API函数结果很容易就会告诉您调用失败。忽视它们是一个坏习惯,所以现在就改掉这个习惯。
void cleanD3D(){
d3d->Release();
d3ddev->Release();
}