CreateDXGIFactory завершается ошибкой с -2004942761 (0x887f0057) - PullRequest
0 голосов
/ 19 июня 2019

Я написал 32-битную игру на C ++ с использованием Visual Studio 2010, которая таинственным образом работает на разных компьютерах, но не на других. Сейчас я занимаюсь разработкой для Windows 10. Игра использует Direct3D (Directx10 и 11). На компьютерах, которые не запускают игру, я неизбежно получаю сообщение об ошибке при вызове CreateDXGIFactory (см. Заголовок). Я убежден, что что-то не установлено должным образом, но я не знаю, что еще нужно установить. На каждом компьютере, на котором установлена ​​Visual Studio 10 (среда, в которой я написал игру), игра работает нормально. (Полагаю, это может быть совпадением.)

У меня совершенно нет идей.

Чтобы проверить это, я использую новый ноутбук Lenovo (игра, кстати, также не будет работать на рабочем столе друга) из работы под управлением Windows 10. После установки (я создал установку для своей игры используя стандартную программу установки, которая поставляется с VS 2010), я запускаю игру, и она выдает мне вышеупомянутую ошибку. Моя программа установки обнаружила зависимости: d3d11.dll, d3dx10_43.dll, d3dx11_43.dll, DINPUT8.dll, DSOUND.dll, dxgi.dll, Microsoft_VS100_CRT_x86.msm. В процессе установки программа установки запускает программу установки Microsoft DirectX Software Development Kit (не молча; пользователь должен принять соглашение.) После установки я запускаю программу и получаю вышеупомянутую ошибку.

Затем я сделал следующее:

  • Удаление игры.
  • Ран DxDiag; Есть 2 дисплея: 1) Intel UHD Graphics P630; 2) NVIDIA Quadro p2000 W / MaxQ
  • Dxdiag сказал мне, что у меня установлен DirectX 12 (и я пытаюсь использовать 10 и 11, поэтому они должны быть там).
  • Я установил распространяемые файлы Visual C ++ 2010, потому что там их не было. (Я столкнулся с ошибкой при установке и обнаружил в сети, что мне нужно удалить самые последние из них перед установкой 2010 года.)
  • Переустановил мою игру.
  • Выполнен и получил ту же ошибку.

Вот первая часть моей функции инициализации, которая содержит код, который создает фабрику (виновник находится внизу, CreateDXGIFactory):

bool D3DClass::Initialize(int viewportWidth, int viewportHeight, bool vsync, HWND hwnd, bool fullscreen, float screenDepth, float screenNear)
{
    std::string sFn = "D3DClass::Initialize";

    HRESULT result;
    IDXGIFactory* factory;
    IDXGIAdapter* adapter;
    IDXGIOutput* adapterOutput;
    unsigned int numModes, i, numerator, denominator;
    size_t stringLength;
    DXGI_MODE_DESC* displayModeList;
    DXGI_ADAPTER_DESC adapterDesc;
    int error;
    DXGI_SWAP_CHAIN_DESC swapChainDesc;
    D3D_FEATURE_LEVEL featureLevel;
    ID3D11Texture2D* backBufferPtr;
    D3D11_TEXTURE2D_DESC depthBufferDesc;
    D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
    D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
    D3D11_RASTERIZER_DESC rasterDesc;
    D3D11_VIEWPORT viewport;
    float fieldOfView, screenAspect;
    D3D11_DEPTH_STENCIL_DESC depthDisabledStencilDesc;
    D3D11_BLEND_DESC blendStateDescription;
    int adapterWidth;
    int adapterHeight;

    if (fullscreen)
    {
        adapterWidth = GetSystemMetrics(SM_CXSCREEN);
        adapterHeight = GetSystemMetrics(SM_CYSCREEN);
    }
    else
    {
        RECT rc;
        GetClientRect(hwnd, &rc);
        adapterWidth = rc.right - rc.left;
        adapterHeight = rc.bottom - rc.top;
    }


    CHelpers::LogMessage(ige::FileLogger::LOG_INFO, sFn, "AdapterWidth=%d, AdapterHeight=%d", adapterWidth, adapterHeight);

    // Store the vsync setting.
    m_vsync_enabled = vsync;

    // Create a DirectX graphics interface factory.
    result = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory);
    if(FAILED(result))
    {
        CHelpers::LogMessage(ige::FileLogger::LOG_ERROR, sFn, "CreateDXGIFactory failed with result = %d", MAKE_DXGI_HRESULT(result));
        return false;
    }

Когда я запускаю это на своей рабочей станции, при вызове CreateDXGIFactory я получаю десятичный результат 3666300, что является ожидаемым и успешным.

ВАЖНО : на рабочем столе моей рабочей станции в разделе «Приложения и компоненты» отображается «Microsoft DirectX SDK (июнь 2010 г.)». Я не вижу ничего такого на ноутбуке Lenovo, хотя я неоднократно успешно его устанавливал. Почему ??

Я потратил десятки часов, пытаясь понять это, и я нахожусь в конце. Кто-нибудь может помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...