0

我已经开始关注手工英雄系列了。他手动加载 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);

此代码运行和编译没有任何问题;

谢谢您的帮助!

4

0 回答 0