我正在尝试使用 RawInput API 获取输入设备的名称,但是在分配名称字符串时出现了一个奇怪的错误。基本上我在另一个项目中看到了它,它运行良好。这是有缺陷的代码:
std::string Input::GetDeviceName(void* device)
{
size_t size;
bool result = GetRawInputDeviceInfo(device, RIDI_DEVICENAME, null, &size) ;
if(result < 0)
{
throw RawInputException(GetLastError(), L"GetRawInputDeviceInfo(InputDeviceDataRequest::Name)");
}
std::vector<std::string::value_type> data(size);
result = GetRawInputDeviceInfo(device, RIDI_DEVICENAME, &data[0], &size);
if(result < 0)
{
throw RawInputException(GetLastError(), L"GetRawInputDeviceInfo(InputDeviceDataRequest::Name)");
}
std::string name = std::string(data.cbegin(), data.cend());
return(name);
}
相同的代码在我从中读取的教程实现中运行良好,但是当我使用它时,它会在*HeapAlloc(_crtheap, 0, size ? size : 1);*处触发断点,从std的调用堆栈向下 10 级: :string _name = std::string(data.cbegin(), data.cend()); .我检查了向量的值,它的大小为 61。我认为问题出在实际内容上?但是 std::string::value_type 会出现什么问题?GetRawInputDeviceInfo() 返回 true,所以它成功填充用字符向上矢量。正如我所提到的,我从中读取它的教程代码构建并完美运行。对于那些感兴趣的人,这里是项目的链接:这家伙停止更新它,但它几乎功能齐全