後述のソースをビルドすると
0x00d00e26 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
と表示されプログラムが終了してしまいます
呼び出し履歴を見るとRender関数の中でエラーが発生しているのですが、何が原因で起こっているかが解りません
どのようにソースを修正すれば問題が解消されるでしょうか。よろしくお願いします
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
LPDIRECT3D9 g_pD3D;
D3DPRESENT_PARAMETERS g_D3DPParams;
LPDIRECT3DDEVICE9 g_pD3DDevice = 0;
HRESULT InitDirect3D(HWND hWnd);
VOID Render(LPDIRECT3DDEVICE9 theDevice);
VOID CleanUpDirect3D(void);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){
HWND windhwnd;
GetKeyBoard();
windhwnd = CreateWindow(
"UKM", // ウィンドウクラスの名前
"SDKで作成したウィンドウ", // ウィンドウのキャプション
WS_OVERLAPPEDWINDOW, // ウィンドウスタイル
CW_USEDEFAULT, // ウィンドウのx座標
CW_USEDEFAULT, // ウィンドウのy座標
CW_USEDEFAULT, // ウィンドウの幅
CW_USEDEFAULT, // ウィンドウの高さ
NULL, // 親ウィンドウのハンドル
NULL, // メニューのハンドル
hInstance, // アプリケーションのインスタンスハンドル
NULL ); // WM_CREATEメッセージのlParamへ渡す値
ShowWindow(windhwnd, nCmdShow); // ウィンドウの表示状態を設定
UpdateWindow(windhwnd); // ウィンドウのクライアント領域を更新
InitDirect3D(windhwnd);
Render(g_pD3DDevice);
CleanUpDirect3D();
}
HRESULT InitDirect3D(HWND hWnd)
{
//Direct3Dオブジェクトの生成
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))){return(E_FAIL);}
//Direct3Dデバイスを生成するための構造体を設定する。Zバッファ尽付き
ZeroMemory(&g_D3DPParams, sizeof(D3DPRESENT_PARAMETERS));
//プレゼンテーションパラメータ
//今表示されているモニタの設定と同じ
g_D3DPParams.BackBufferFormat = D3DFMT_UNKNOWN;
//ウィンドウモードにする
g_D3DPParams.BackBufferCount = 1;
//マルチサンプリングは行わない
g_D3DPParams.MultiSampleType = D3DMULTISAMPLE_NONE;
//マルチサンプリングは行わないので0
g_D3DPParams.MultiSampleQuality = 0;
//Direct3Dにスワップエフェクトをまかせる
g_D3DPParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
//Direct3Dに震度バッファの管理を任せる
g_D3DPParams.EnableAutoDepthStencil = TRUE;
//震度バッファのフォーマット(通常はこの値で問題ない)
g_D3DPParams.AutoDepthStencilFormat= D3DFMT_D16;
//カバーウインドウ=アプリケーションのウィンドウ
g_D3DPParams.hDeviceWindow = hWnd;
//フラグは使わない
g_D3DPParams.Flags = 0;
//今のリフレッシュレートをそのまま使う
g_D3DPParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
//モニタの垂直回帰を待つ
g_D3DPParams.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
//CreateDeviceでDirect3Dを初期化するとき、HAL、HELの組み合わせは
//プログラマーが自由に決めることができるが
//普通はこの組み合わせで十分
//Direct3Dデバイスの生成。まず、HALのいいやつ
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_D3DPParams, &g_pD3DDevice)))
{
//コケたら普通のHAL(HEL?)
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &g_D3DPParams, &g_pD3DDevice)))
{
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &g_D3DPParams, &g_pD3DDevice)))
{
//それでもコケたらおしまい
//MessageBox(NULL, "Direct3Dを初期化できませんでした", KWINDOW_TITLE, MB_OK | MB_ICONSTOP);
return(E_FAIL);
}
}
}
return(S_OK);
}
//----------------------------------------Render
//
// 実際の描画作業
//
//----------------------------------------
VOID Render(LPDIRECT3DDEVICE9 theDevice)
{
//Zバッファとバックバッファのクリア
theDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 64), 1.0f, 0);
//シーンの開始
if(SUCCEEDED(theDevice->BeginScene()))
{
//終わりの定型処理
theDevice->EndScene(); //シーンの終了
}
//バックバッファ表画面に反得させる
HRESULT hr = theDevice->Present(NULL, NULL, NULL, NULL);
}
//-----------------------------------------CleanUpDirect3D
//
// Direct3Dの後始末
//
//-----------------------------------------
VOID CleanUpDirect3D(void)
{
//Direct3Dデバイスなどの解放
SAFE_RELEASE(g_pD3DDevice);
SAFE_RELEASE(g_pD3D);
}