我已经开始关注手工英雄系列了。他手动加载 XInput,因此创建了一个函数存根。它看起来像这样:
#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState)
typedef X_INPUT_GET_STATE(x_input_get_state);
X_INPUT_GET_STATE(XInputGetStateStub) {
return 0;
}
global_variable x_input_get_state *XInputGetState_ = XInputGetStateStub;
#define XInputGetState XInputGetState_;
这是在任何其他功能之上定义的。global_variable 是静态的#define。
这段代码几乎可以工作。如果我使用它会成功if (XInputGetState_(ControllerIndex, &ControllerState) == ERROR_SUCCESS)
编译,但在我使用时不会编译if (XInputGetState(ControllerIndex, &ControllerState) == ERROR_SUCCESS)
但是,我可以执行以下操作。
auto func = XInputGetState(ControllerIndex, &ControllerState);
if (func(ControllerIndex, &ControllerState) == ERROR_SUCCESS)
我完全不知道为什么会这样。
你可以在这里找到官方的函数定义
编辑:
只是为了让事情变得更加混乱。XInputSetState 函数也是手动定义的。
#define X_INPUT_SET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_VIBRATION *pVibration)
typedef X_INPUT_SET_STATE(x_input_set_state);
X_INPUT_SET_STATE(XInputSetStateStub) {
return 0;
}
global_variable x_input_set_state *XInputSetState_ = XInputSetStateStub;
#define XInputSetState XInputSetState_;
然后我可以像这样调用函数
XINPUT_VIBRATION Vibration;
Vibration.wLeftMotorSpeed = 60000;
Vibration.wRightMotorSpeed = 60000;
XInputSetState(0, Vibration);
此代码运行和编译没有任何问题;
谢谢您的帮助!