Pregunta

He creado una interfaz gráfica sencilla utilizando Windows Forms en Visual C ++ 2008. Hay un botón en la interfaz gráfica de usuario. Cuando se pulsa el botón Quiero cursor del ratón a punto en las coordenadas (0,900). He creado encabezado independiente y c archivo fuente ++ que los conjuntos de la posición del cursor a la posición especificada (x, y). Para esto he utilizado la función () SetCursorPos de Win32. Escribí el código para establecer la posición del cursor en un archivo separado porque quiero solamente la interfaz gráfica de usuario que se construirá utilizando .NET. Para otras funciones que quiero usar nativo de C ++ y la biblioteca Win32.

Si bien la construcción del código, consigo los siguientes mensajes de error en el momento de la vinculación:

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)
¿Fue útil?

Solución

  

(? SetCursorPos @@ $$ J18YGHHH @ Z)

Nota cómo el nombre de la función consiguió el C ++ decoración de nombres. Su declaración de la función que está mal, usando extern "C" se requiere. Evitar este tipo de errores simplemente incluyendo <windows.h>.

Sin embargo, no hacerlo de esta manera. Windows Forms le permite mover el cursor también:

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

Yo estaba seriamente engañado por la decoración de nombres, que es un mensaje de error de vinculador desagradable. El verdadero problema es que su proyecto no es la vinculación de la biblioteca de importación de Windows requerido. Haga clic en el proyecto, Propiedades, Linker, de entrada. Retire el $ (NoInherit) de las Dependencias adicionales de ajuste. Si utiliza VS2010 a continuación, poner "User32.lib" en ese entorno.

Aún debe utilizar la clase .NET cursor en este caso específico.

Otros consejos

No se puede hacer eso.

Si desea utilizar C ++ de NET, debe exponer una interfaz de C para .NET que puede P / Invoke, o si tiene que utilizar C ++ / CLI en su lugar, lo que se traducirá en código administrado. (Bueno, supongo que se podría exponer un elemento de COM así, pero eso es un conjunto el otro lata de gusanos)

Esto suena como que está metiendo en dificultades - ¿hay alguna razón usted no desea utilizar código administrado ya sea por completo o código nativo por completo? Lograr que se mezcle es un PITA real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top