#c #windows #visual-studio-2010 #command-line-interface
#c #Windows #visual-studio-2010 #интерфейс командной строки
Вопрос:
Я работаю над довольно запутанным проектом, в котором я получаю доступ к классам, написанным на простом старом C , из проекта, использующего C / CLI. Это проект с графическим интерфейсом Windows Forms, который использует множество тех же функций, что и его (не CLI) дочерний проект на C .
В одном из моих классов, который я пытаюсь настроить для работы в обеих средах, я опрашиваю нажатия клавиш с помощью этой функции:
inline bool IsKeyDown(unsigned char ch) const {
return (GetAsyncKeyState(ch) amp; (1u << 15)) != 0;
}
Я получаю как неразрешенный токен, так и неразрешенные ошибки внешнего символа на
"extern "C" short __stdcall GetAsyncKeyState(int)" (?GetAsyncKeyState@@$$J14YGFH@Z) referenced in function "public: bool __clrcall Engine::InputManager::IsKeyDown(unsigned char)const " (?IsKeyDown@InputManager@Engine@@$$FQBM_NE@Z)
Очевидно, что проблема связана с GetAsyncKeyState()
, но я не уверен, что должно отличаться для реализации, удобной для CLI. Кто-нибудь может подсказать мне, как это исправить? Функция работает должным образом в моей среде, отличной от CLI (и работает уже несколько месяцев). Я очень новичок в этом CLI, поэтому любая помощь была бы замечательной, и никакая помощь не может быть слишком специфичной.
Если это поможет, я использую Visual Studio 2010 и компилирую с /clr
параметром (не :pure
или :safe
).
Ответ №1:
Библиотека MSDN предоставляет подробную информацию о том, какие заголовочные файлы и библиотеки необходимо включить для любой конкретной функции.
В этом случае вам понадобится windows.h (который у вас уже должен быть) и user32.lib (который, вероятно, отсутствует). Поэтому добавьте
#pragma comment(lib, "user32.lib")
в верхней части вашего кода и все должно быть хорошо. В качестве альтернативы вы могли бы добавить user32.lib в список библиотек на страницах свойств проекта, не забывая делать это для каждой конфигурации, например, для отладки, а также для выпуска.
Ответ №2:
Только что возникла та же проблема. Решение состоит в том, чтобы связать с a .библиотека, которая имеет соответствующий символ, который в данном случае является user32.lib.
Я исправил проблему в Visual Studio, заставив проект использовать унаследованные значения. Установите этот флажок в свойствах проекта, и это должно исправить: