我为游戏制作了一个插件,以增加对该游戏的替代输入设备(例如方向盘)的支持。
我的一些用户在尝试为我的插件设置轮子时遇到了异常。仅当存在另一个插件时,这些特定的轮子 和 才会发生。引发的异常为0xC00000FD,并在调用CreateEffect时发生。
由于无法访问麻烦的硬件,我很难重现此错误。具体来说,这似乎只发生在 Logitech G920方向盘上,并且仅当正常启动游戏并且ScriptHookVDotNet插件也处于活动状态时才发生。自从报告发布以来,我仅设法添加了更多日志记录,这使我进入了异常代码和引起异常的函数。
可以通过不使用插件,不使用特定方向盘或通过第三方启动器(RagePluginHook)启动游戏来解决此问题。
作为概念验证,我在一个单独的Windows控制台应用程序(用于配置输入)中重复使用了有问题的代码,而不会发生此问题。
我的code is hosted on GitHub,这是引起问题的特定行:
// These are class members
LPDIRECTINPUTEFFECT m_cfEffect = nullptr;
DICONSTANTFORCE m_constantForceParams;
// LPDIRECTINPUTDEVICE8 diDevice has been retrieved elsewhere
DIEFFECT cfEffect;
createConstantForceEffect(DIJOFS_X, 1, cfEffect);
HRESULT hr = diDevice->CreateEffect(GUID_ConstantForce, &cfEffect, &m_cfEffect, nullptr); // This causes the exception
createConstantForceEffect已在Microsoft示例后生成:
void WheelDirectInput::createConstantForceEffect(DWORD axis, int numAxes, DIEFFECT &diEffect) {
DWORD rgdwAxes[1] = { axis };
LONG rglDirection[1] = { 0 };
m_constantForceParams.lMagnitude = 0;
ZeroMemory(&diEffect, sizeof(diEffect));
diEffect.dwSize = sizeof(DIEFFECT);
diEffect.rgdwAxes = rgdwAxes;
diEffect.rglDirection = rglDirection;
diEffect.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
diEffect.dwDuration = INFINITE;
diEffect.dwSamplePeriod = 0;
diEffect.dwGain = DI_FFNOMINALMAX;
diEffect.dwTriggerButton = DIEB_NOTRIGGER;
diEffect.dwTriggerRepeatInterval = 0;
diEffect.cAxes = numAxes;
diEffect.lpEnvelope = nullptr;
diEffect.cbTypeSpecificParams = diEffect.cAxes * sizeof(DICONSTANTFORCE);
diEffect.lpvTypeSpecificParams = &m_constantForceParams;
diEffect.dwStartDelay = 0;
}
我只想知道为什么在此特定情况下会导致此错误,以及我能做些什么来提取更多错误,而不仅仅是捕获异常。
异常0xC00000FD似乎指向堆栈溢出错误,但我不知道是什么原因导致该错误。我没有递归,实际上我的代码对于所有其他硬件/软件组合都可以正常运行。