FormatMessage возвращает 0 для ошибки d3d11. Как я могу получить описание ошибки для ошибок d3d11? - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь создать макрос отладки для вызовов d3d11. Вот как это выглядит:

#define ERROR_MSG(DESC, MSG, CODE)\
        MessageBox(nullptr, MSG, DESC, MB_ICONERROR | MB_OK);\
        exit(CODE);             

#define ASSER_D3D11_CALL(CALL)\
        {\
            DWORD msg = HRESULT_CODE(CALL);\
            if(msg != 0)\
            {\
                LPSTR str = nullptr;\
                if(0 == FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE |  FORMAT_MESSAGE_IGNORE_INSERTS,\
                                    NULL,\
                                    msg,\
                                    LANG_ENGLISH,\
                                    str,\
                                    32,\
                                    nullptr))\
                {\
                    ERROR_MSG("Unknown Error", str, msg);\
                }\
                ERROR_MSG("Error", str, msg);\
            }\
        }

Когда я пытаюсь симулировать ошибку, я не получаю никакого сообщения, FormatMessage () возвращает 0. Вот код, который вызывает ошибку. Я попробовал это и в других случаях.

DXGI_SWAP_CHAIN_DESC d_SwapChain{ 0 };
    ... some setup that works...
    d_SwapChain.OutputWindow = wnd.m_hwnd + 1; // adding 1 here causes error
    ... 

    // Create device and buffers
    ASSER_D3D11_CALL(D3D11CreateDeviceAndSwapChain(...correctly configured stuff...));

Что я могу сделать, чтобы получить сообщение об ошибке?

1 Ответ

0 голосов
/ 30 марта 2020

Какую операционную систему вы используете? Значения Direct3D HRESULT не добавлялись к FormatMessage до Windows 8, поэтому при Windows 7 вы не получите никаких результатов.

См. это сообщение в блоге для открытого исходная версия DXERR.LIB, предназначенная для этого.

...