.exe 中的 0x00411a68 处最可能的错误: 0xC0000005: 读取位置 0x00000000 时发生访问冲突

.exe 中的 0x00411a68 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
我是新手,望大牛赐教啊。
在我运行的时候会出现"0x00411a68"指令引用的"0x00000000"内存不能为"read"的错误提示。
在我一步一步的调试的中发现,在执行UpdateWindow(hWnd);语句时会直接跳到VOID Direct3DRender();的场景绘制函数结果就出现了标题中的错误提示。
请问有什么解决方案吗?
附录,我的代码(Direct3D编程基础上的例程):
#include<windows.h>
#include<d3d9.h>

wchar_t *g_pClassName=L"HelloDirect3D"; //窗口类名
wchar_t *g_pWindowName=L"Direct3D实例"; //窗口标题名

LPDIRECT3DDEVICE9 g_pd3dDevice=NULL; //direct3d设备接口
HRESULT InitDirect3D(HWND hWnd); //初始化direct3d
VOID Direct3DRender(); //渲染图形
VOID Direct3DCleanup(); //清理direct3d资源

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(
HINSTANCE hInstance, //当前实例句柄
HINSTANCE hPrevInstance, //前一实例句柄
LPSTR lpCmdLine, //命令行参数指针
int nShowCmd) //窗口显示命令
{
//初始化窗口类
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //光标形状
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口小图标
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc; //消息处理函数
wndclass.lpszClassName=g_pClassName; //窗口类名
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW; //窗口样式

if(!RegisterClass(&wndclass))
return 0;
//////////////////////////////////////////////////////////////////////////
//创建窗口
HWND hWnd=CreateWindow(
g_pClassName, //窗口类名
g_pWindowName, //窗口标题
WS_OVERLAPPEDWINDOW, //窗口样式
CW_USEDEFAULT, //窗口最初的x位置
CW_USEDEFAULT, //窗口最初的y位置
CW_USEDEFAULT, //窗口的宽度
CW_USEDEFAULT, //窗口的高度
NULL, //父窗口句柄
NULL, //窗口菜单句柄
wndclass.hInstance, //应用程序实例句柄
NULL); //创建窗口的参数

InitDirect3D(hWnd);
//////////////////////////////////////////////////////////////////////////
ShowWindow(hWnd,nShowCmd); //显示窗口
UpdateWindow(hWnd); //更新窗口
//////////////////////////////////////////////////////////////////////////
//消息循环
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message!=WM_QUIT) //取得消息
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg); //转换消息
DispatchMessage(&msg); //投递消息
}
else
{
Direct3DRender();
}
}
UnregisterClass(g_pClassName,wndclass.hInstance);
return 0;
}
//////////////////////////////////////////////////////////////////////////
//窗口消息处理函数
LRESULT CALLBACK WndProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_PAINT: //客户区重绘消息
Direct3DRender(); //渲染图形
ValidateRect(hWnd,NULL);//更新客户区的显示
break;
case WM_DESTROY: //窗口销毁消息
Direct3DCleanup(); //清理direct3d
PostQuitMessage(0); //退出程序
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);//默认的消息处理
}
HRESULT InitDirect3D(HWND hWnd)
{
LPDIRECT3D9 pD3D=NULL;
pD3D=Direct3DCreate9(D3D_SDK_VERSION);
if(pD3D==NULL) return E_FAIL;

D3DCAPS9 caps;
int vp=0;
pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps); //获取指定设备的性能参数

if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) //支持硬件顶点运算
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else //不支持,采用软件顶点运算
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
//////////////////////////////////////////////////////////////////////////
//创建Direct3D设备接口
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth=CW_USEDEFAULT;
d3dpp.BackBufferHeight=CW_USEDEFAULT;
d3dpp.BackBufferFormat=D3DFMT_A8B8G8R8;