C++ DirectInput未解析的外部符号
这件事快把我逼疯了。我已经尝试了我能想到的一切。以下是DirectInput代码的相关部分C++ DirectInput未解析的外部符号,c++,c,windows,input,directinput,C++,C,Windows,Input,Directinput,这件事快把我逼疯了。我已经尝试了我能想到的一切。以下是DirectInput代码的相关部分 BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context); if(DirectInput8Interface == DI_OK) { DirectInput8InterfacePointer->EnumDevices( DI8DEVCLASS_GAMECTRL,
BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context);
if(DirectInput8Interface == DI_OK)
{
DirectInput8InterfacePointer->EnumDevices(
DI8DEVCLASS_GAMECTRL,
(LPDIENUMDEVICESCALLBACKA) EnumDevicesCallback,
NULL,
DIEDFL_ATTACHEDONLY);
}
当我尝试编译时,会出现以下错误:
未解析的外部符号“int\uu stdcall EnumDevicesCallback(结构
DIDEVICEINSTANCA const*,void*)”
(?EnumDevicesCallback@@YGHPBUDIDEVICEINSTANCEA@@PAX@Z)引用于
作用_WinMain@16.
如您所见,编译器找不到的外部符号与EnumDevicesCallback函数的DIDEVICEINSTANCE参数有关。不应该这样,因为我已经包含了dinput.h并链接到了dinput8.lib和dxguid.lib。我甚至尝试在自己的代码中定义DIDEVICEINSTANCE,但得到的消息是,它与以前的定义冲突
这个错误消息意味着什么?我敢说,罪魁祸首是
BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE*DeviceInfo,VOID*Context)代码>-该函数可能是一个C函数,但您在.cpp文件中将其声明为C++函数
与其这样做,不如在声明中包含一个适当的.h文件,该文件可能指定了正确的extern
。我敢说,罪魁祸首是BOOL CALLBACK enumDeviceCallback(const DIDEVICEINSTANCE*DeviceInfo,VOID*Context)代码>-该函数可能是一个C函数,但您在.cpp文件中将其声明为C++函数
不要这样做,而是在声明中包含一个适当的.h文件,该文件可能指定了正确的extern
。回调不是这样工作的
EnumDeviceCallback
不是一个存在的函数。您应该编写自己的函数,EnumDevices
将为每个设备调用。您的函数不必被调用EnumDevicesCallback
——这就是一个例子
例如,如果您只想打印每个设备的名称,可以编写
BOOL CALLBACK PrintDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context)
{
_tprintf("%s %s\n", DeviceInfo->tszProductName, DeviceInfo->tszProductName);
return DIENUM_CONTINUE;
}
然后将PrintDevicesCallback
传递给EnumDevices
,这不是回调的工作方式
EnumDeviceCallback
不是一个存在的函数。您应该编写自己的函数,EnumDevices
将为每个设备调用。您的函数不必被调用EnumDevicesCallback
——这就是一个例子
例如,如果您只想打印每个设备的名称,可以编写
BOOL CALLBACK PrintDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context)
{
_tprintf("%s %s\n", DeviceInfo->tszProductName, DeviceInfo->tszProductName);
return DIENUM_CONTINUE;
}
然后通过<代码> PrimtDeVistCurrBeS/<代码> >代码>枚举设备< /C> > /P>你使用C还是C++编译器?它们不一样。可能与您的重复。您确定已提供函数的定义
BOOL CALLBACK enumDeviceCallback(const DIDEVICEINSTANCE*DeviceInfo,VOID*Context)代码>在程序中?注意:强制转换函数指针总是错误的<代码>(LPDIVIEDVICESCELABACKA)枚举DeCyCalBACK,< /代码>不应该有强制转换,如果需要编译,那么就修复它,这样就不会了。@艾伦:不是复制品,请看IMMIbIS的答案。你使用C还是C++编译器?它们不一样。可能与您的重复。您确定已提供函数的定义BOOL CALLBACK enumDeviceCallback(const DIDEVICEINSTANCE*DeviceInfo,VOID*Context)代码>在程序中?注意:强制转换函数指针总是错误的(LPDIENUMDEVICESCALLBACKA)EnumDevicesCallback,
不应该在那里进行强制转换-如果它需要强制转换才能编译,那么请修复它,使其不会重复。@Alan:不是重复的,请参见immibis的回答。::slaps emount::Doh!我以前只见过示例形式的回调函数。我没有想到我需要自己写。感谢所有指出这一点的人,它解决了编译问题!我以前只见过示例形式的回调函数。我没有想到我需要自己写。感谢所有指出这一点的人,它解决了编译问题。