DirectInput未解析的外部符号

时间:2016-01-28 20:25:35

标签: c++ c windows input directinput

这个让我疯了。我已经尝试了所有我能想到的东西。以下是DirectInput代码的相关部分。

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

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

当我尝试编译时,我收到错误:

  

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

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

该错误消息的含义是什么?

2 个答案:

答案 0 :(得分:2)

这不是回调的工作方式。

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

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

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

然后将PrintDevicesCallback传递给EnumDevices

答案 1 :(得分:0)

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

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