Поэтому я пытался исправить странную ошибку в SDK игрового движка, когда вместо собственного курсора игры используется курсор загрузки Windows.
Исправление для этого здесь: http://www.crydev.net/wiki/index.php/Use_Custom_Cursor#Step_1:_Fixing_The_Cursor_Bug.
Я следил за исправлением, но продолжаю получать их при сборке игровой DLL:
Error 1 error LNK2019: unresolved external symbol "public: __thiscall MODCursor::MODCursor(void)" (??0MODCursor@@QAE@XZ) referenced in function "public: __thiscall CGame::CGame(void)" (??0CGame@@QAE@XZ) C:\Users\User\Desktop\Crytek\Mods\CryEngine2\Code\Game.obj GameDll
Error 2 error LNK2019: unresolved external symbol "public: __thiscall MODCursor::~MODCursor(void)" (??1MODCursor@@QAE@XZ) referenced in function "public: virtual __thiscall CGame::~CGame(void)" (??1CGame@@UAE@XZ) C:\Users\User\Desktop\Crytek\Mods\CryEngine2\Code\Game.obj GameDll
Да, обычно я могу легко решить эту проблему, правильно определив класс, но в этом случае это не сработало. Что я могу делать не так?
Файлы в том виде, в каком они есть в руководстве по исправлению, поэтому публиковать файлы здесь нет никакого смысла, так как здесь они будут пустой тратой пространства. Если файлы действительно нужны для расследования этой проблемы, я буду загружать их, если кто-нибудь их попросит.
Возможно, есть ошибка в самом исправлении? Одним из возможных отличий от исправления для моей сборки является то, что исправление использует Visual Studio 2008, я использую Visual Studio 2013.
Может быть, попытаться поместить все это в файл .h:
#ifndef _MOD_CURSOR
#define _MOD_CURSOR
#include <windows.h>
#include "resource.h"
#undef GetUserName // This is a macro in windows.h, gives issues with GetUserName() of ISystem
class MODCursor : public ISystemEventListener
{
public:
MODCursor() {
gEnv->pSystem->GetISystemEventDispatcher()->RegisterListener(this);
m_cursor = LoadCursor((HINSTANCE)g_hInst, MAKEINTRESOURCE(IDC_CURSOR1));
SetCursor(m_cursor);
}
~MODCursor(){
gEnv->pSystem->GetISystemEventDispatcher()->RemoveListener(this);
}
private:
virtual void OnSystemEvent( ESystemEvent event,UINT_PTR wparam,UINT_PTR lparam ) {
if(event == ESYSTEM_EVENT_TOGGLE_FULLSCREEN || event == ESYSTEM_EVENT_RESIZE || event == ESYSTEM_EVENT_CHANGE_FOCUS){
if (m_cursor != GetCursor())
SetCursor(m_cursor);
}
}
HCURSOR m_cursor;
};
#endif
Других решений пока нет …