失败,出现错误 87:参数不正确.如何判断哪个参数不正确?

Failed with error 87: The parameter is incorrect. How to determine which parameter is incorrect?

本文关键字:参数 不正确 判断 何判断 错误 失败      更新时间:2023-10-16

我正在尝试在单元测试中尽可能简单地创建一个 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);
}

断言失败。CreateWindowExW 失败,出现错误 87:参数不正确。

参考: 创建窗口exw 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();
}