Вопрос

Я создал простой графический интерфейс, используя формы Windows в Visual C ++ 2008. Есть кнопка в графическом интерфейсе. Когда кнопка нажата, я хочу курсор мыши, чтобы указать на координаты (0900). Я создал отдельный исходный файл заголовка и C ++, который устанавливает положение курсора в указанное место (X, Y). Для этого я использовал функцию Win32 SetCursorPos (). Я написал код для настройки положения курсора в отдельном файле, потому что я хочу, чтобы только GUI был создан с помощью .NET. Для других функций я хочу использовать нативную библиотеку C ++ и Win32.

При создании кода я получаю следующие сообщения об ошибках во время связывания:

1>SimpleForms.obj : error LNK2028: unresolved token (0A00000F) "extern "C" int __stdcall SetCursorPos(int,int)" (?SetCursorPos@@$$J18YGHHH@Z) referenced in function "private: void __clrcall SimpleForms::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@SimpleForms@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>SimpleForms.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall SetCursorPos(int,int)" (?SetCursorPos@@$$J18YGHHH@Z) referenced in function "private: void __clrcall SimpleForms::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@SimpleForms@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
Это было полезно?

Решение

(? SetCursorPos @ $$ j18yghhh @ z)

Обратите внимание, как имя функции получила украшение имени C ++. Ваша декларация функции неверна, требуется использование Extern «C». Избегать этих ошибок, просто в том числе <windows.h>.

Но не делай этого таким образом. Windows Forms позволяет вам слишком перемещать курсор:

    System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
        System::Windows::Forms::Cursor::Position = Point(0, 900);
    }

Я был серьезно введен в заблуждение от украшения имени, это неприятное сообщение об ошибке связи. Настоящая проблема заключается в том, что ваш проект не связывает необходимую библиотеку импорта Windows. Щелкните правой кнопкой мыши проект, свойства, линкер, ввод. Удалите $ (NONENHERIT) из дополнительных настроек зависимостей. Если вы используете VS2010, то поставьте «user32.lib» в этой настройке.

Вы все равно должны использовать класс курсора .NET в этом конкретном случае.

Другие советы

Вы не можете это сделать.

Если вы хотите использовать C ++ из .NET, вы должны открыть интерфейс C для .NET, который вы можете P / вызывать, или вам нужно использовать C ++ / CLI, что приведет к управляемому коду. (Ну, я полагаю, вы могли бы также разоблачить COM-элемент, но это совершенно другая банка червей)

Это звучит так, как вы просто просили трудности - есть ли причина, по которой вы не хотите использовать полностью управляемый код, либо полностью нативный код? Получение их в смеси - королевская лаваша.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top