2012-11-24 11 views
7

Desidero recuperare le stringhe di errore per DirectX 9, ma sul Web posso trovare il file FormatMessage() e _com_error.ErrorMessage(), entrambi i quali non riescono.Come recuperare stringhe di errori per DirectX 9

hr = g_pd3dDevice->GetRenderTargetData(... 
... // the debugger tells me hr = 0x8876086c 
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
    NULL, hr, 0, (LPTSTR)&lpBuf, 0, NULL)) 
// it returns 0 with lpBuf unallocated 

FormatMessage() non riesce e io uso il nuovo con GetLastError() per vedere perché FormatMessage() ha esito negativo: "Il sistema non riesce a trovare il testo del messaggio per il numero di messaggio 0x% 1 nel file di messaggio per% 2 ".

_com_error.ErrorMessage() mi dice "Errore 0x8876086c sconosciuto"

+0

BTW: c'è un modo comune per ottenere stringhe di errore per tutti HRESULT? – LeOpArD

+0

In realtà, i codici di errore e i messaggi sono classificati. Ad esempio, il sottosistema di rete ha i propri codici e messaggi, DX ha il suo, ecc. Quindi è necessario conoscere un tipo di operazione che si stava eseguendo per ottenere un messaggio corrispondente all'errore che si sta ottenendo. –

+0

Guarda il file di intestazione d3d9.h per i codici di errore. Troverai una corrispondenza con D3DERR_INVALIDCALL, la stringa non ti dirà perché hai passato argomenti non validi. Neanche il tuo frammento. –

risposta

15

Per ottenere il messaggio di errore DirectX, ci sono due funzioni - DXGetErrorString() e DXGetErrorDescription(). Detto questo, FormatMessage() non ti porterà quello che vuoi. Ecco un piccolo esempio:

// You'll need this include file and library linked. 
#include <DxErr.h> 
#pragma comment(lib, "dxerr.lib") 

...

if (FAILED(hr)) { 
    fprintf(stderr, "Error: %s error description: %s\n", 
     DXGetErrorString(hr), DXGetErrorDescription(hr)); 
} 
+0

Funziona! Grazie. – LeOpArD

+0

dxerr è deprecato. Inoltre, in base al seguente link: "Il VS 2015 C Runtime non è compatibile con DXERR.LIB fornito nel legacy DirectX SDK" https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres- dxerr-lib / – kreuzerkrieg