2010-09-09 12 views
0

J'ai créé une interface graphique simple à l'aide de Windows Forms dans Visual C++ 2008. Il y a un bouton dans l'interface graphique. Lorsque le bouton est pressé, je veux que le curseur de la souris pointe aux coordonnées (0,900). J'ai créé l'en-tête séparé et le fichier source C++ qui définit la position du curseur à l'emplacement spécifié (x, y). Pour cela, j'ai utilisé la fonction SetCursorPos() de Win32. J'ai écrit le code pour définir la position du curseur dans un fichier séparé car je veux que l'interface graphique soit construite en utilisant .NET. Pour les autres fonctions, je veux utiliser la bibliothèque native C++ et Win32.Utilisation de bibliothèques Win32 via des éléments de formulaire Windows

Tout en construisant le 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)" ([email protected]@[email protected]) referenced in function "private: void __clrcall SimpleForms::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z) 

1>SimpleForms.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall SetCursorPos(int,int)" ([email protected]@[email protected]) referenced in function "private: void __clrcall SimpleForms::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z) 

Répondre

2

(? SetCursorPos @@ $$ J18YGHHH @ Z)

Notez comment le nom de la fonction a la décoration de nom C++. Votre déclaration de la fonction est erronée, en utilisant extern "C" est nécessaire. Évitez ce genre d'erreurs en incluant simplement <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); 
    } 

je sérieusement induits en erreur par la décoration de nom, est un message d'erreur de liens désagréable. Le vrai problème est que votre projet ne lie pas la bibliothèque d'importation Windows requise. Cliquez avec le bouton droit sur le projet, Propriétés, Lieur, Entrée. Supprimez le $ (NoInherit) du paramètre Additional Dependencies. Si vous utilisez VS2010, placez "user32.lib" dans ce paramètre.

Vous devez toujours utiliser la classe .NET Cursor dans ce cas spécifique.

+0

@Hans c'est ce que j'ai fait. J'ai inclus et j'utilise sa fonction SetCursorPos(). Je n'ai pas codé SetCursorPos() par moi-même. – nishant

+0

Je ne sais pas, vous devrez poster du code repro pour nous laisser diagnostiquer cela. Ce n'est certainement pas normal. –

+0

Plus tôt, j'ai écrit le code pour définir la position de la souris dans un fichier séparé comme je l'ai décrit dans le problème principal. Mais maintenant je l'ai intégré dans Form1.h fichier lui-même. J'ai inclus windows.h au début de Form1.h. Et dans l'événement click du bouton, j'ai appelé la fonction SetCursorPos(). – nishant

1

Vous ne pouvez pas faire cela. Si vous souhaitez utiliser C++ à partir de .NET, vous devez exposer une interface C à .NET que vous pouvez utiliser P/Invoke, ou vous devez utiliser C++/CLI à la place, ce qui générera du code managé. (Eh bien, je suppose que vous pourriez aussi exposer un élément COM, mais c'est une autre boîte de Pandore)

Cela ressemble à une simple demande de difficulté - y a-t-il une raison que vous ne voulez pas utiliser? soit un code complètement géré, soit un code complètement natif? Les amener à mélanger est un PITA royal.

+0

En fait, le programme principal que je dois développer est axé sur les performances. J'ai donc voulu coder les algorithmes complexes en utilisant des bibliothèques natives C++ et win32. Pour construire l'interface graphique .NET est une option facile. J'ai donc pensé à fusionner les deux options. Il semble que je vais devoir chercher d'autres alternatives réalisables. – nishant

+0

@nishant: Cela dit, la charge de travail de faire les P/Invoke à travers la barrière native/gérée est probablement beaucoup plus lourde que ce que vous auriez économisé en écrivant les parties principales du programme en code natif. Si vous avez besoin de la vitesse native, juste "ngen" les bibliothèques sur la machine cible avant de les exécuter. –

+0

Thnx pour votre suggestion mon ami !! Je vais sûrement essayer ça. – nishant