这个让我疯了。我已经尝试了所有我能想到的东西。以下是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,并收到一条消息,说明它与之前的定义有冲突。
该错误消息的含义是什么?
答案 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
。