سؤال

لقد قمت بإنشاء واجهة مستخدمية بسيطة باستخدام Windows Forms في Visual C ++ 2008. يوجد زر في واجهة المستخدم الرسومية. عند الضغط على الزر ، أريد أن يشير مؤشر الماوس إلى الإحداثيات (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)
هل كانت مفيدة؟

المحلول

(؟ setCursorpos $$ J18YGHHH@Z)

لاحظ كيف حصل اسم الوظيفة على زخرفة اسم C ++. إن إعلانك عن الوظيفة خاطئ ، باستخدام "C" الخارجي مطلوب. تجنب هذا النوع من الأخطاء من خلال تضمين ببساطة <windows.h>.

لكن ، لا تفعل ذلك بهذه الطريقة. تتيح لك نماذج Windows تحريك المؤشر أيضًا:

    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 في هذه الحالة المحددة.

نصائح أخرى

لا يمكنك فعل ذلك.

إذا كنت ترغب في استخدام C ++ من .NET ، فيجب عليك فضح واجهة C لـ .NET التي يمكنك استدعاءها ، أو تحتاج إلى استخدام C ++/CLI بدلاً من ذلك ، مما سيؤدي إلى رمز مُدار. (حسنًا ، أفترض أنه يمكنك فضح عنصر com أيضًا ، لكن هذا علبة أخرى كاملة من الديدان)

هذا يبدو أنك فقط تطلب صعوبة - هل هناك أي سبب لا ترغب في استخدامه إما رمز إدارته بالكامل ، أو رمز أصلي تمامًا؟ الحصول عليها للخلط هو بيتا الملكية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top