初始化DX时发生c++访问冲突

c++ access violation at initialising DX

本文关键字:c++ 访问冲突 DX 初始化      更新时间:2023-10-16

我本打算创建一个窗口并初始化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);