DirectInput 未解析的外部符号

DirectInput Unresolved External Symbol

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

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

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

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

unresolved external symbol "int __stdcall EnumDevicesCallback(struct DIDEVICEINSTANCEA const *,void *)" (?EnumDevicesCallback@@YGHPBUDIDEVICEINSTANCEA@@PAX@Z) referenced in function _WinMain@16.

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

该错误消息是什么意思?

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

不要这样做,而是在声明中包含一个正确的 .h 文件,该文件可能指定了正确的 extern

这不是回调的工作方式。

EnumDevicsCallback 不是一个存在的函数。您应该编写您自己的 函数,EnumDevices 将为每个设备调用该函数。您的函数不必被称为 EnumDevicesCallback - 这是一个例子。

例如,如果你只想打印每个设备的名称,你可以这样写

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

然后将PrintDevicesCallback传递给EnumDevices