初始化DX时发生c++访问冲突
c++ access violation at initialising DX
我本打算创建一个窗口并初始化Direct9,但我发现VS2010表明DX_Init()
函数存在访问冲突,我很困惑我错在哪里。
#include <Windows.h>
#include <d3dx9.h>
#include <sstream>
#include <string>
#include "D3D9.h"
#define memclear(var) memset(&wndClassData, 0x00, sizeof(var));
WNDCLASSEX wndClassData;
LRESULT CALLBACK MainWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam, LPARAM lParam)
{
switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}
struct DXGlobals{
IDirect3D9 *pD3D;
IDirect3DDevice9 *pDevice;
};
DXGlobals gDX;
//我在这个部分有一些问题
void DX_Init(HWND hWnd)
{
gDX.pD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
memclear(d3dpp);
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
HRESULT hr = gDX.pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&gDX.pDevice
);
}
//问题到此结束
void DX_Update(){
}
void DX_Dispose(){
gDX.pD3D->Release();
gDX.pDevice->Release();
}
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//WNDCLASSEX wndClassData;
memclear(wndClassData);
wndClassData.cbSize = sizeof(WNDCLASSEX);
wndClassData.lpfnWndProc = MainWindowProc;
wndClassData.hInstance = hInstance;
wndClassData.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
wndClassData.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndClassData.lpszClassName="ColourMatchingWindow";
//memset(&wndClassData, 0x00, sizeof(wndClassData));
ATOM wndClass = RegisterClassEx(&wndClassData);
HWND mainWnd = CreateWindow(
(LPCSTR)wndClass,
"ColourMatching",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
DX_Init(mainWnd);
MSG msg;
for(;;){
while(PeekMessage(&msg, NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message==WM_QUIT){
break;
}
DX_Update();
}
DX_Dispose();
return 0;
}
}
这看起来是错误的
#define memclear(var)
memset(&wndClassData, 0x00, sizeof(var));
D3DPRESENT_PARAMETERS d3dpp;
memclear(d3dpp);
可能你的意思是宏看起来像这个
#define memclear(var)
memset(&var, 0x00, sizeof(var));
但实际上,你不应该使用毫无意义的宏。只需编写简单而明显的代码,而不是更复杂和模糊的D3DPRESENT_PARAMETERS d3dpp;
memset(&d3dpp, 0x00, sizeof d3dpp);
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- C++ 读取访问冲突,0xCDCDCDCD