【问题标题】:How to get DirectDraw Last error string(DirectX 7)如何获取 DirectDraw Last 错误字符串(DirectX 7)
【发布时间】:2013-09-03 08:59:53
【问题描述】:

当我执行 DirectDraw 方法失败时,如何在 DirectX 7 中获取失败错误字符串?

if (FAILED(lpddPrimarySurface->SetPalette(lpddPalette)))
{
    MessageBox(NULL, **"I want to get the failure string here."**, "Error", MB_OK);
    return 0;
}

这里我想弹出失败信息的错误信息。如何获取错误的LPCSTR字符串?

【问题讨论】:

  • 您正在设置调色板?您是否尝试针对 8 位 (256) 颜色模式?较新的硬件可能不支持。
  • 是的,我总是 SetPalette 失败。不能使用 8 位 (256) 颜色模式时应该使用什么?能否提供一些细节,谢谢。
  • 您从未说过 SetPalette 返回的错误代码。您的调色板对象完全有可能被错误初始化。我只是评论说,在 2013 年使用 8 位显示模式似乎很奇怪。我不知道过去 10 年制造的单个显卡不支持 24 位模式(因此,没有调色板是必需的)。
  • @selbie: 除非你想在图像中做调色板旋转效果或一些调色板映射。

标签: c++ directx directdraw


【解决方案1】:

对于 NTSTATUS 错误,可能发生以下情况。不确定这是否适用于 Direct Draw 和 Direct X HRESULT 错误代码,但它可能会在系统消息表中出现。我认为您不需要 ntdll 句柄,因为查找是在系统消息表上完成的。我已经指定了它以防万一,因为我从来没有在没有它的情况下进行过测试。

请原谅静态字符数组,这只是为了展示示例,不是一个好的实现:)

static const char *NTStatusToString(DWORD NtStatusCode)
{
    LPVOID lpMessageBuffer = 0;
    HMODULE hNTDll = GetModuleHandle("ntdll.dll");
    static char szBuffer[256];

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_FROM_HMODULE,
        hNTDll,
        NtStatusCode,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMessageBuffer,
        0,
        NULL);

    memset(szBuffer, 0, sizeof(szBuffer));
    _snprintf(szBuffer, sizeof(szBuffer)-1, "%s", lpMessageBuffer);

    LocalFree(lpMessageBuffer);

    return szBuffer;
}

这个帖子表明它可以工作 How should I use FormatMessage() properly in C++? 但是这个帖子表明它不会 Is there a way to get the string representation of HRESULT value using win API? 并且你需要做更多的工作。

延伸阅读:hereherehere

【讨论】:

  • 非常感谢,我试试看。
【解决方案2】:

DirectDraw 没有提供错误字符串。您必须查看返回的 HRESULT 并根据需要格式化您自己的字符串。例如:

http://www.gamedev.net/topic/8268-ddraw-error-code/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多