Использование библиотек Win32 через элементы Windows Form - PullRequest
0 голосов
/ 09 сентября 2010

Я создал простой графический интерфейс с использованием Windows Forms в Visual C ++ 2008. В GUI есть кнопка.Когда кнопка нажата, я хочу, чтобы курсор мыши указывал на координаты (0,900).Я создал отдельный заголовок и исходный файл C ++, который устанавливает позицию курсора в указанном месте (x, y).Для этого я использовал функцию SetCursorPos () Win32.Я написал код для установки позиции курсора в отдельном файле, потому что я хочу, чтобы только графический интерфейс строился с использованием .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)

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

(? SetCursorPos @@ $$ J18YGHHH @ Z) * ​​1002 *

Обратите внимание, как имя функции получило оформление имени в 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. Щелкните правой кнопкой мыши проект, Свойства, Линкер, Ввод. Удалите $ (NoInherit) из параметра «Дополнительные зависимости». Если вы используете VS2010, тогда укажите «user32.lib» в этой настройке.

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

1 голос
/ 09 сентября 2010

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

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

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

...