DirectInput 未解析的外部符号
DirectInput Unresolved External Symbol
这个让我抓狂。我已经尝试了我能想到的一切。以下是 DirectInput 代码的相关部分。
BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context);
if(DirectInput8Interface == DI_OK)
{
DirectInput8InterfacePointer->EnumDevices(
DI8DEVCLASS_GAMECTRL,
(LPDIENUMDEVICESCALLBACKA) EnumDevicesCallback,
NULL,
DIEDFL_ATTACHEDONLY);
}
当我尝试编译时,出现错误:
unresolved external symbol "int __stdcall EnumDevicesCallback(struct
DIDEVICEINSTANCEA const *,void *)"
(?EnumDevicesCallback@@YGHPBUDIDEVICEINSTANCEA@@PAX@Z) referenced in
function _WinMain@16.
如您所见,编译器找不到的外部符号与EnumDevicesCallback函数的DIDEVICEINSTANCE参数有关。那不应该,因为我已经包含 dinput.h 并链接到 dinput8.lib 和 dxguid.lib。我什至尝试在我自己的代码中定义 DIDEVICEINSTANCE 并收到一条消息,它与以前的定义冲突。
该错误消息是什么意思?
我敢说,罪魁祸首是 BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context);
- 该函数可能是 C 函数,但您在 .cpp 文件中将其声明为 C++ 函数。
不要这样做,而是在声明中包含一个正确的 .h 文件,该文件可能指定了正确的 extern
。
这不是回调的工作方式。
EnumDevicsCallback
不是一个存在的函数。您应该编写您自己的 函数,EnumDevices
将为每个设备调用该函数。您的函数不必被称为 EnumDevicesCallback
- 这是一个例子。
例如,如果你只想打印每个设备的名称,你可以这样写
BOOL CALLBACK PrintDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context)
{
_tprintf("%s %s\n", DeviceInfo->tszProductName, DeviceInfo->tszProductName);
return DIENUM_CONTINUE;
}
然后将PrintDevicesCallback
传递给EnumDevices
。
这个让我抓狂。我已经尝试了我能想到的一切。以下是 DirectInput 代码的相关部分。
BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context);
if(DirectInput8Interface == DI_OK)
{
DirectInput8InterfacePointer->EnumDevices(
DI8DEVCLASS_GAMECTRL,
(LPDIENUMDEVICESCALLBACKA) EnumDevicesCallback,
NULL,
DIEDFL_ATTACHEDONLY);
}
当我尝试编译时,出现错误:
unresolved external symbol "int __stdcall EnumDevicesCallback(struct DIDEVICEINSTANCEA const *,void *)" (?EnumDevicesCallback@@YGHPBUDIDEVICEINSTANCEA@@PAX@Z) referenced in function _WinMain@16.
如您所见,编译器找不到的外部符号与EnumDevicesCallback函数的DIDEVICEINSTANCE参数有关。那不应该,因为我已经包含 dinput.h 并链接到 dinput8.lib 和 dxguid.lib。我什至尝试在我自己的代码中定义 DIDEVICEINSTANCE 并收到一条消息,它与以前的定义冲突。
该错误消息是什么意思?
我敢说,罪魁祸首是 BOOL CALLBACK EnumDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context);
- 该函数可能是 C 函数,但您在 .cpp 文件中将其声明为 C++ 函数。
不要这样做,而是在声明中包含一个正确的 .h 文件,该文件可能指定了正确的 extern
。
这不是回调的工作方式。
EnumDevicsCallback
不是一个存在的函数。您应该编写您自己的 函数,EnumDevices
将为每个设备调用该函数。您的函数不必被称为 EnumDevicesCallback
- 这是一个例子。
例如,如果你只想打印每个设备的名称,你可以这样写
BOOL CALLBACK PrintDevicesCallback(const DIDEVICEINSTANCE* DeviceInfo, VOID* Context)
{
_tprintf("%s %s\n", DeviceInfo->tszProductName, DeviceInfo->tszProductName);
return DIENUM_CONTINUE;
}
然后将PrintDevicesCallback
传递给EnumDevices
。