2012-02-18 4 views
1

Я пытаюсь использовать следующий код:Directx 11 Синий экран смерти при запуске моей программы

HRESULT hResult; 
HDC hDC; 
IDXGISurface1 *pSurface = NULL; 
hResult = m_flashTexture->QueryInterface(__uuidof(IDXGISurface1), (void**)&pSurface); 
hResult = pSurface->GetDC(TRUE, &hDC);     
assert(SUCCEEDED(hResult)); 
m_flashPlayer->DrawFrame(hDC); 

Где drawFrame это ...

void CFlashDXPlayer::DrawFrame(HDC dc) 
{ 
if (m_dirtyFlag) 
{ 
    IViewObject* pViewObject = NULL; 
    m_flashInterface->QueryInterface(IID_IViewObject, (LPVOID*) &pViewObject); 
    if (pViewObject != NULL) 
    { 
     // Combine regions 
     HRGN unionRgn, first, second = NULL; 
     unionRgn = CreateRectRgnIndirect(&m_dirtyRects[0]); 
     if (m_dirtyRects.size() >= 2) 
      second = CreateRectRgn(0, 0, 1, 1); 

     for (std::vector<RECT>::iterator it = m_dirtyRects.begin() + 1; it != m_dirtyRects.end(); ++it) 
     { 
      // Fill combined region 
      first = unionRgn; 
      SetRectRgn(second, it->left, it->top, it->right, it->bottom); 
      unionRgn = CreateRectRgn(0, 0, 1, 1); 

      CombineRgn(unionRgn, first, second, RGN_OR); 
      DeleteObject(first); 
     } 

     if (second) 
      DeleteObject(second); 

     RECT clipRgnRect; GetRgnBox(unionRgn, &clipRgnRect); 
     RECTL clipRect = { 0, 0, m_width, m_height }; 

     // Fill background 
     if (m_transpMode != TMODE_FULL_ALPHA) 
     { 
      // Set clip region 
      SelectClipRgn(dc, unionRgn); 

      COLORREF fillColor = GetBackgroundColor(); 
      HBRUSH fillColorBrush = CreateSolidBrush(fillColor); 
      FillRgn(dc, unionRgn, fillColorBrush); 
      DeleteObject(fillColorBrush); 

      // Draw to main buffer 
      HRESULT hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, dc, &clipRect, &clipRect, NULL, 0); 
      assert(SUCCEEDED(hr)); 
     } 
     else 
     { 
      if (m_alphaBlackDC == NULL) 
      { 
       // Create memory buffers 
       BITMAPINFOHEADER bih = {0}; 
       bih.biSize = sizeof(BITMAPINFOHEADER); 
       bih.biBitCount = 32; 
       bih.biCompression = BI_RGB; 
       bih.biPlanes = 1; 
       bih.biWidth = LONG(m_width); 
       bih.biHeight = -LONG(m_height); 

       m_alphaBlackDC = CreateCompatibleDC(dc); 
       m_alphaBlackBitmap = CreateDIBSection(m_alphaBlackDC, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&m_alphaBlackBuffer, 0, 0); 
       SelectObject(m_alphaBlackDC, m_alphaBlackBitmap); 

       m_alphaWhiteDC = CreateCompatibleDC(dc); 
       m_alphaWhiteBitmap = CreateDIBSection(m_alphaWhiteDC, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&m_alphaWhiteBuffer, 0, 0); 
       SelectObject(m_alphaWhiteDC, m_alphaWhiteBitmap); 
      } 

      HRESULT hr; 
      HBRUSH fillColorBrush; 

      // Render frame twice - against white and against black background to calculate alpha 
      SelectClipRgn(m_alphaBlackDC, unionRgn); 

      COLORREF blackColor = 0x00000000; 
      fillColorBrush = CreateSolidBrush(blackColor); 
      FillRgn(m_alphaBlackDC, unionRgn, fillColorBrush); 
      DeleteObject(fillColorBrush); 

      hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, m_alphaBlackDC, &clipRect, &clipRect, NULL, 0); 
      assert(SUCCEEDED(hr)); 

      // White background 
      SelectClipRgn(m_alphaWhiteDC, unionRgn); 

      COLORREF whiteColor = 0x00FFFFFF; 
      fillColorBrush = CreateSolidBrush(whiteColor); 
      FillRgn(m_alphaWhiteDC, unionRgn, fillColorBrush); 
      DeleteObject(fillColorBrush); 

      hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, m_alphaWhiteDC, &clipRect, &clipRect, NULL, 0); 
      assert(SUCCEEDED(hr)); 

      // Combine alpha 
      for (LONG y = clipRgnRect.top; y < clipRgnRect.bottom; ++y) 
      { 
       int offset = y * m_width * 4 + clipRgnRect.left * 4; 
       for (LONG x = clipRgnRect.left; x < clipRgnRect.right; ++x) 
       { 
        BYTE blackRed = m_alphaBlackBuffer[offset]; 
        BYTE whiteRed = m_alphaWhiteBuffer[offset]; 
        m_alphaBlackBuffer[offset + 3] = 255 - (whiteRed - blackRed); 
        offset += 4; 
       } 
      } 

      // Blit result to target DC 
      BitBlt(dc, clipRgnRect.left, clipRgnRect.top, 
        clipRgnRect.right - clipRgnRect.left, 
        clipRgnRect.bottom - clipRgnRect.top, 
        m_alphaBlackDC, clipRgnRect.left, clipRgnRect.top, SRCCOPY); 
     } 

     DeleteObject(unionRgn); 
     pViewObject->Release(); 
    } 

    m_dirtyFlag = false; 
    m_dirtyRects.clear(); 
    m_dirtyUnionRect.left = m_dirtyUnionRect.top = LONG_MAX; 
    m_dirtyUnionRect.right = m_dirtyUnionRect.bottom = -LONG_MAX; 
} 
} 

Я должен также упомянуть, что я установил до m_flashTexture, используя следующие:

D3D11_TEXTURE2D_DESC textureDesc;     
ZeroMemory(&textureDesc, sizeof(textureDesc));     
textureDesc.Width = width;     
textureDesc.Height = height;     
textureDesc.MipLevels = 1;     
textureDesc.ArraySize = 1;     
textureDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;     
textureDesc.SampleDesc.Count = 1;     
textureDesc.Usage = D3D11_USAGE_DEFAULT;     
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE |  D3D11_BIND_RENDER_TARGET;     
textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE; 
HRESULT hr = device->CreateTexture2D(&textureDesc, NULL, &m_flashTexture); 

Всякий раз, когда я запускаю этот код (есть больше, но он захоронен в кучу других классов, дайте мне знать, если вы думаете, что что-то еще будет полезно ..) Я получаю синий экран смерти, который вызывается где-то в функции flashPlayer-> drawFrame(). Я понятия не имею, что вызывает синий экран.

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

Спасибо.

Дополнительная информация

Здесь результаты от аварии дамп

ADDITIONAL_DEBUG_TEXT: 
Use '!findthebuild' command to search for the target build information. 
If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols. 

FAULTING_MODULE: fffff80002c01000 nt 

DEBUG_FLR_IMAGE_TIMESTAMP: 4d41a3e1 

READ_ADDRESS: unable to get nt!MmSpecialPoolStart 
unable to get nt!MmSpecialPoolEnd 
unable to get nt!MmPoolCodeStart 
unable to get nt!MmPoolCodeEnd 
fffff8814061c6a0 

FAULTING_IP: 
igdpmd64+15a878 
fffff880`0697c878 8b0408   mov  eax,dword ptr [rax+rcx] 

MM_INTERNAL_CODE: 5 

CUSTOMER_CRASH_COUNT: 1 

DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT 

BUGCHECK_STR: 0x50 

CURRENT_IRQL: 0 

LAST_CONTROL_TRANSFER: from fffff80002c283bf to fffff80002c7dc40 

STACK_TEXT: 
fffff880`0a7e5878 fffff800`02c283bf : 00000000`00000050 fffff881`4061c6a0 00000000`00000000  fffff880`0a7e59e0 : nt+0x7cc40 
fffff880`0a7e5880 00000000`00000050 : fffff881`4061c6a0 00000000`00000000 fffff880`0a7e59e0  00000000`00000005 : nt+0x273bf 
fffff880`0a7e5888 fffff881`4061c6a0 : 00000000`00000000 fffff880`0a7e59e0 00000000`00000005 00000000`00000000 : 0x50 
fffff880`0a7e5890 00000000`00000000 : fffff880`0a7e59e0 00000000`00000005 00000000`00000000 00000000`00000000 : 0xfffff881`4061c6a0 


STACK_COMMAND: .bugcheck ; kb 

FOLLOWUP_IP: 
igdpmd64+15a878 
fffff880`0697c878 8b0408   mov  eax,dword ptr [rax+rcx] 

SYMBOL_NAME: igdpmd64+15a878 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: igdpmd64 

IMAGE_NAME: igdpmd64.sys 

BUCKET_ID: WRONG_SYMBOLS 

Followup: MachineOwner 

Кто-нибудь знает, что это значит?

+1

Вы пробовали обновлять видеодрайверы? Я не очень хорошо разбираюсь в этой области, но мне не кажется, что DirectX должен быть способен вызывать синий экран даже при неправильном использовании. –

+0

Невозможно войти в систему или отступить от отладчика до точки, ближайшей к краху? – Gubatron

+0

Yup Я пробовал это. И я согласен, что не думаю, что это было бы так, как я использовал directx ... вы бы подумали, что это будет обычной ошибкой для этого. –

ответ

0

Каждый раз, когда вы пишете приложение для пользовательского пространства и оно вызывает BSoD, в этом случае есть ошибка в некотором коде уровня ядра (либо в самом ядре Windows, либо в каком-то драйвере), это выглядит как igdpmd64.sys). Проще говоря, ОС должна никогда, ни при каких обстоятельствах, авария из-за чего-то приложения пользовательского пространства. Поэтому я бы посмотрел, есть ли обновление для этого драйвера или нет.

Однако также существует вероятность того, что у вас есть ошибка в коде, который неправильно использует DirectX и запускает эту ошибку драйвера.

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

Смежные вопросы