这个快把我逼疯了。我已经试过了我能想到的一切。以下是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 *,void *)“在函数_WinMain@16中引用。
如您所见,编译器找不到的外部符号与EnumDevicesCallback函数的DIDEVICEINSTANCE参数相关。不应该是这样,因为我已经包含了dinput.h,并链接到dinput8.lib和dxguid.lib。我甚至尝试在自己的代码中定义DIDEVICEINSTANCE,并得到了一条与先前定义相冲突的消息。
这条错误信息意味着什么?
发布于 2016-01-28 20:47:26
这不是回调的工作方式。
EnumDevicsCallback不是一个存在的函数。您应该编写自己的函数,EnumDevices将为每个设备调用该函数。您的函数不必被称为EnumDevicesCallback --这就是一个例子。
例如,如果您只想打印每个设备的名称,则可以编写
BOOL CALLBACK PrintDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context)
{
_tprintf("%s %s\n", DeviceInfo->tszProductName, DeviceInfo->tszProductName);
return DIENUM_CONTINUE;
}然后将PrintDevicesCallback传递给EnumDevices。
发布于 2016-01-28 20:35:11
我敢说,罪魁祸首是BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context); -这个函数很可能是C-函数,但是您在.cpp文件中声明它为C++函数。
不是这样做的,而是在声明中包含一个正确的.h文件,该声明很可能指定了正确的extern。
https://stackoverflow.com/questions/35071336
复制相似问题