0

这个让我发疯。我已经尝试了我能想到的一切。以下是 DirectInput 代码的相关部分。

BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo,   VOID* Context);

if(DirectInput8Interface == DI_OK)
{
  DirectInput8InterfacePointer->EnumDevices(
    DI8DEVCLASS_GAMECTRL,
    (LPDIENUMDEVICESCALLBACKA) EnumDevicesCallback,
    NULL,
    DIEDFL_ATTACHEDONLY); 
}

当我尝试编译时,出现错误:

在函数 _WinMain@16 中引用的未解析的外部符号“int __stdcall EnumDevicesCallback(struct DIDEVICEINSTANCEA const *,void *)”(?EnumDevicesCallback@@YGHPBUDIDEVICEINSTANCEA@@PAX@Z)。

可以看到,编译器找不到的外部符号与 EnumDevicesCallback 函数的 DIDEVICEINSTANCE 参数有关。那不应该,因为我已经包含了 dinput.h 并链接到 dinput8.lib 和 dxguid.lib。我什至尝试在我自己的代码中定义 DIDEVICEINSTANCE 并收到一条消息,它与以前的定义冲突。

该错误消息可能意味着什么?

4

2 回答 2

2

这不是回调的工作方式。

EnumDevicsCallback不是一个存在的函数。您应该编写自己的函数来EnumDevices调用每个设备。不必调用您的函数EnumDevicesCallback- 这是一个示例。

例如,如果您只想打印每个设备的名称,您可以编写

BOOL CALLBACK PrintDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo,   VOID* Context)
{
    _tprintf("%s %s\n", DeviceInfo->tszProductName, DeviceInfo->tszProductName);
    return DIENUM_CONTINUE;
}

然后传递PrintDevicesCallbackEnumDevices.

于 2016-01-28T20:47:26.577 回答
0

我敢说,罪魁祸首是BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context);- 该函数可能是 C 函数,但您在 .cpp 文件中将其声明为 C++ 函数。

与其这样做,不如在声明中包含一个适当的 .h 文件,该文件可能已正确extern指定。

于 2016-01-28T20:35:11.717 回答