失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
Failed with error 87: The parameter is incorrect. How to determine which parameter is incorrect?
我正在尝试在单元测试中尽可能简单地创建一个 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()
分配的内存。messageBuffer
和displayBuffer
都需要通过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();
}
相关文章:
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
- CMake 设置使用不正确的参数数调用的目标属性
- CreateThread的参数不正确
- Boost::Asio串行读/写打开:参数不正确
- 模板对象管理器,参数不正确
- Cmake add_executable使用不正确的参数数量调用
- 为什么构造函数C++接受不正确的类型作为参数?
- 收到错误 87,安装程序的参数不正确DiGetDeviceInterfaceDetail
- 带有 decltype 的模板参数数量不正确
- 我将类型库(.tlb)导入到Delphi中,但函数参数似乎不正确.我应该如何解决它
- 我无法正确获取这些变量声明...为什么这些参数不起作用?我只是将 n 值设置为数组长度
- 值传递的参数在 Visual Studio 2015 x64 调试器中显示不正确
- std ::旋转参数不正确
- 'decltype'参数不正确
- LoadLibraryEx错误87(参数不正确)
- Win32 窗口包装器出错(参数不正确)
- 参数不正确
- 从 C# 传递到非托管 dll 后参数不正确