c++ - Failed with error 87 : The parameter is incorrect. 如何确定哪个参数不正确?

标签 c++ winapi

我试图在单元测试中尽可能简单地创建一个 win32 窗口,但我收到错误 87:如何获取哪个参数不正确?

#include <windows.h>
#include <strsafe.h>

LPTSTR GetErrorMessage(wstring fnName)
{
    LPTSTR messageBuffer{};
    LPTSTR displayBuffer{};
    DWORD dw = GetLastError();

    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        0, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&messageBuffer, 0, 0);

    displayBuffer = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, lstrlen(messageBuffer) + (fnName.size() + 40) * sizeof(TCHAR));
    StringCchPrintf(displayBuffer, LocalSize(displayBuffer) / sizeof(TCHAR), L"%s failed with error %d: %s", fnName.c_str(), dw, messageBuffer);

    return displayBuffer;
}

TEST_METHOD(WinTest)
{
    auto hwnd = CreateWindowExW(WS_EX_APPWINDOW, 0, L"test w", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 800, 600, 0, 0, 0, 0);
    Assert::IsNotNull(hwnd, GetErrorMessage(L"CreateWindowExW"));

    ShowWindow(hwnd, SW_SHOWDEFAULT);
    Sleep(1000);
}

Assert failed. CreateWindowExW failed with error 87: The parameter is incorrect.

引用:createwindowexw on learn.microsoft.com

最佳答案

要回答您提出的特定问题 - Win32 API 不会告诉您哪个参数无效。您必须阅读失败函数的文档,然后调试您的代码以比较您实际传递给函数的值,看看它们与函数期望的可接受值有何不同。

在这个特殊示例中,您将 NULL 指针传递给 CreateWindowEx()lpClassName 参数,这是不允许的。您必须指定要创建的窗口类的名称。


附带说明一下,您的 GetErrorMessage() 函数正在泄漏内存,因为它不会释放由 FormatMessage()LocalAlloc( )messageBufferdisplayBuffer 都需要用 LocalFree() 释放。

我强烈建议你让 GetErrorMessage() 返回一个 wstring 而不是原始的 TCHAR* 指针,例如:

wstring GetErrorMessage(const wstring &fnName)
{
    DWORD dw = GetLastError();

    wostringstream displayBuffer;
    displayBuffer << fnName << L" failed with error " << dw;

    LPWSTR messageBuffer{};
    if (FormatMessageW(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        0,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPWSTR)&messageBuffer,
        0,
        0))
    {
        displayBuffer << L": " << messageBuffer;
        LocalFree(messageBuffer);
    }

    return displayBuffer.str();
} 

关于c++ - Failed with error 87 : The parameter is incorrect. 如何确定哪个参数不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345592/

相关文章:

c++ - 使用 setw : to eof or not to eof? 读取

c++ - 存储测试数据

delphi - 如何使用纯 GDI 对 Canvas 区域进行颜色混合(按指定的 alpha 值着色)?

c++ - 通过 SYSTEMTIME 检查文件的 LastWriteTime 是昨天

winforms - 如何使用 Windows 窗体在窗口标题栏中绘制自定义按钮?

python - Cython,关于 vector (大小)构造函数的混淆

c++ - 在 C++ 中哪个内存区域是 const 对象?

c - Windows 中 char * 和 LPSTR 的区别

c++ - 在 C++ 中为指定字符着色

c++ - std::vector 的高性能替代品