Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DirectInput未解析的外部符号_C++_C_Windows_Input_Directinput - Fatal编程技术网

C++ 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,

这件事快把我逼疯了。我已经尝试了我能想到的一切。以下是DirectInput代码的相关部分

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!我以前只见过示例形式的回调函数。我没有想到我需要自己写。感谢所有指出这一点的人,它解决了编译问题!我以前只见过示例形式的回调函数。我没有想到我需要自己写。感谢所有指出这一点的人,它解决了编译问题。