通过Windows窗体元素使用Win32库

时间:2010-09-09 16:16:46

标签: .net visual-c++ visual-studio-2008 c++-cli name-decoration

我在visual C ++ 2008中使用Windows窗体创建了一个简单的GUI。GUI中有一个按钮。按下按钮时,我希望鼠标光标指向坐标(0,900)。我创建了单独的头文件和c ++源文件,将光标位置设置为指定位置(x,y)。为此,我使用了Win32的SetCursorPos()函数。我编写了用于将光标位置设置在单独文件中的代码,因为我只想使用.NET构建GUI。对于其他函数,我想使用本机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 个答案:

答案 0 :(得分:2)

  

(?SetCursorPos @@ $$ J18YGHHH @ Z)

注意函数名称如何获得C ++名称修饰。您的功能声明是错误的,需要使用extern“C”。只需添加<windows.h>即可避免这类错误。

但是,不要这样做。 Windows窗体也允许您移动光标:

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

我被名字装饰严重误导,这是一个令人不愉快的链接器错误消息。真正的问题是您的项目没有链接所需的Windows导入库。右键单击项目,“属性”,“链接器”,“输入”。从Additional Dependencies设置中删除$(NoInherit)。如果您使用VS2010,则在该设置中输入“user32.lib”。

在这种特定情况下,您仍应使用.NET Cursor类。

答案 1 :(得分:1)

你做不到。

如果要使用.NET中的C ++,则必须将C接口公开给可以P / Invoke的.NET,或者需要使用C ++ / CLI,这将导致托管代码。 (好吧,我想你也可以暴露一个COM元素,但那可能是其他一些蠕虫)

这听起来好像你只是在寻找困难 - 有什么理由你不想使用完全托管代码或完全本机代码?让它们混合是皇家PITA。