استخدام مكتبات Win32 من خلال عناصر نموذج Windows
-
01-10-2019 - |
سؤال
لقد قمت بإنشاء واجهة مستخدمية بسيطة باستخدام 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 أيضًا ، لكن هذا علبة أخرى كاملة من الديدان)
هذا يبدو أنك فقط تطلب صعوبة - هل هناك أي سبب لا ترغب في استخدامه إما رمز إدارته بالكامل ، أو رمز أصلي تمامًا؟ الحصول عليها للخلط هو بيتا الملكية.