none
Ошибка CreateSurface от DirectX RRS feed

  • Вопрос

  • Не знаю, в какой ветке задавать вопросы по этой теме. Списал из старых руководств такой вот код:

        LPDIRECTDRAW lpDdr;
        LPDIRECTDRAWSURFACE lpSurface;

        DirectDrawCreate(NULL, &lpDdr, NULL);
        lpDdr->SetCooperativeLevel(NULL, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE);
        lpDdr->SetDisplayMode(640, 480, 32);

        HDC hdc;
        DDSURFACEDESC strSurf;
        int res;

        strSurf.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
        strSurf.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
        strSurf.dwBackBufferCount = 1;

        res = lpDdr->CreateSurface(&strSurf, &lpSurface, NULL);
        lpSurface->GetDC(&hdc);
        ::TextOut(hdc, 0, 0, L"Privet!", 5);

    Причём написал его в консольном приложении. (Проверку на ошибки убрал для читаемости).

    Функция CreateSurface поверхности не создаёт и вызов lpSurface->GetDC приводит к исключению. С чем может быть связана неудача создания поверхности?

    Спасибо.

    27 февраля 2014 г. 13:53

Все ответы

  • Если есть "проверка на ошибки", то она сама должна подсказать Вам, в чем проблема. Как она у Вас реализована? Покажите, или сами отладчиком пройдите и увидите, что именно возвращают методы и функции.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 февраля 2014 г. 20:39
  • Ни один из кодов из справки не выдаётся, а структура не создаётся.

        res = lpDdr->CreateSurface(&strSurf, &lpSurface, NULL);
        switch (res)
        {
        case DDERR_INCOMPATIBLEPRIMARY:
            res = 1;
            break;
        case DDERR_INVALIDCAPS:
            res = 2;
            break;
        case DDERR_INVALIDOBJECT:
            res = 3;
            break;
        case DDERR_INVALIDPARAMS:
            res = 4;
            break;
        case DDERR_INVALIDPIXELFORMAT:
            res = 5;
            break;
        case DDERR_NOALPHAHW:
            res = 6;
            break;
        case DDERR_NOCOOPERATIVELEVELSET:
            res = 7;
            break;
        case DDERR_NOFLIPHW:
            res = 8;
            break;
        case DDERR_NOOVERLAYHW:
            res = 9;
            break;
        case DDERR_OUTOFMEMORY:
            res = 10;
            break;
        case DDERR_OUTOFVIDEOMEMORY:
            res = 11;
            break;
        case DDERR_PRIMARYSURFACEALREADYEXISTS:
            res = 12;
            break;
        case DD_OK:
            res = 12;
            break;
        }

    28 февраля 2014 г. 9:47
  • Аналогичный код выдаёт ту же ошибку примерно на том же месте:

        IDirect3D9* pDirect;
        IDirect3DDevice9* pDevice;

        pDirect = Direct3DCreate9(D3D_SDK_VERSION);

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;  // Wait for vertical sync
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;               // Use desktop pixel format (windowed mode)
        d3dpp.BackBufferCount = 1;
        d3dpp.EnableAutoDepthStencil = TRUE;         // Create depth buffer (Z)
        d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // Allow 24 bits of depth buffer, 8 bits of stencil

        // Create the D3DDevice
        pDirect->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDevice);

        pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 0), 1.0f, 0);

    Не создаётся структура в pDirect->CreateDevice.

    28 февраля 2014 г. 10:19
  • А что тогда возвращается? Какой код? В состав VS входит утилита Error Lookup (доступна из меню сервис под именем "Поиск ошибки"). Введите полученный код туда, может она подскажет.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    28 февраля 2014 г. 10:21
  • Может Вы библиотеку COM забыли проинициализировать?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    28 февраля 2014 г. 10:23
  • Вообще-то нигде в руководствах почему-то не говорится о необходимости инициализации COM. Проинициализировал и никакого толка. А ошибку выдаёт номер 0x8876086C, Error Lookup такой не знает...
    3 марта 2014 г. 7:12
  • Код ошибки 0x8876086C - это D3DERR_INVALIDCALL. Описан в качестве возможных кодов возврата в методе IDirect3D9::CreateDevice. Видимо, какие-то параметры ему не понравились.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    3 марта 2014 г. 13:03
  • Я пробовал оба варианта кода как на Windows XP, так и на Windows 7. Делал в Visual Studio 2008 Express и в Visual Studio 2012 Professional. Затем попробовал код в оконном приложении, и здесь ошибок не выдаёт (поставил в функцию параметр hWnd вместо NULL). Видимо в этом ошибка. Скажите, в консольном приложении нельзя никак использовать DirectX для вывода? У меня работает только функция изменения разрешения окна SetDisplayMode(640, 480, 32); Можно ли средствами DirectX в консольном приложении вывести хотя бы текст?

    3 марта 2014 г. 13:53
  • Я, к сожалению, не являюсь экспертом в DirectX. Но, из общих соображений, могу сказать, что консольное окно явно не годится для вывода графики. Требуется создать настоящее окно. А это уже требует цикла обработки сообщений и т.п. Другими словами, структура самого приложения должна быть другой.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    3 марта 2014 г. 13:59
  • Я имел ввиду без получения hwnd консольного окна и тому подобных громоздких процедур. подскажите, пожалуйста, какую-нибудь простую в смысле кода, но эффектную вещь, которую можно сделать с помощью DirectX в консольном приложении. Спасибо.
    3 марта 2014 г. 14:02