Question

J'ai créé une interface graphique simple à l'aide de Windows Forms en C ++ visuel 2008. Il y a un bouton dans l'interface graphique. Lorsque le bouton est pressé, je veux curseur de la souris au point de coordonnées (0,900). J'ai créé tête séparée et c ++ fichier source qui définit la position du curseur à l'emplacement spécifié (x, y). Pour cela, je l'ai utilisé la fonction de SetCursorPos () Win32. J'ai écrit le code pour définir la position du curseur dans un fichier séparé parce que je ne veux que l'interface graphique sera construit en utilisant .NET. Pour les autres fonctions que je veux utiliser C ++ natif et bibliothèque Win32.

Alors que la construction du code, je reçois des messages d'erreur suivant au moment de la liaison:

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)
Était-ce utile?

La solution

  

(? SetCursorPos @@ $$ J18YGHHH @ Z)

Notez comment le nom de la fonction a la décoration de nom de C ++. Votre déclaration de la fonction est erronée, en utilisant « C » extern est nécessaire. Évitez ce genre d'erreurs simplement y compris <windows.h>.

Mais, ne le faites pas de cette façon. Windows Forms vous permet de déplacer le curseur trop:

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

J'a été sérieusement induits en erreur par la décoration de nom, qui est un message d'erreur de liens désagréable. Le vrai problème est que votre projet est ne pas lier la bibliothèque d'importation Windows requis. Cliquez droit sur le projet, Propriétés, Linker, Entrée. Retirez le $ (NOINHERIT) du réglage des dépendances supplémentaires. Si vous utilisez VS2010 puis mettre « user32.lib » dans ce contexte.

Vous devriez toujours utiliser la classe curseur .NET dans ce cas spécifique.

Autres conseils

Vous ne pouvez pas le faire.

Si vous voulez utiliser C ++ .NET à partir, vous devez exposer une interface C à .NET que vous pouvez P / Invoke, ou vous devez utiliser C ++ / CLI à la place, ce qui se traduira par le code managé. (Eh bien, je suppose que vous pourriez exposer un élément COM ainsi, mais c'est un tout autre boîte de Pandore)

Cela sonne comme vous demandons simplement de la difficulté - est-il une raison quelconque vous ne voulez pas utiliser le code soit entièrement géré, ou un code complètement natif? Les amener à mélanger est un PITA royal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top