سؤال

تطبيقات Windows GUI المكتوبة في C / C ++ لها "WinMain" كنقطة دخول (بدلا من "الرئيسي"). فهمي لهذا هو أن التحويل البرمجي يولد وظيفة "الرئيسية" التي يجب استدعاؤها بواسطة وقت التشغيل C. تقوم هذه الوظيفة "الرئيسية" بإعداد البيئة اللازمة لوجوي وتدفيات "WinMain" (تحديد مقابض المثيل وما إلى ذلك).

باختصار، أعتقد أن بدء تشغيل وحدة التحكم و GUI تختلف في الطريقة التالية:

تطبيق وحدة التحكم: ج وقت التشغيل -> وظيفة "الرئيسية" (ترميز اليد)

تطبيق واجهة المستخدم الرسومية: جار وقت التشغيل -> وظيفة "الرئيسية" (إنشاء مترجم) -> وظيفة "WinMain" (مرفومة باليد)

أود أن أتحقق من صحة هذا الفهم ومعرفة كيف يمكنني استعمال تعليمات Windows GUI مع وظيفة "الرئيسية" (أي دون الحاجة إلى كتابة "WinMain").

هل كانت مفيدة؟

المحلول

لديك فهم غير صحيح. الفرق بين Main و WinMain، بصرف النظر عن بعض رمز التهيئة الاختلاف، هي المعلمات التي تم تمريرها إليها.

تبدو الرئيسية مثل هذا:

int main(int argc, char* argv[]);

في حين أن WinMain يشبه هذا:

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);

يجب أن يقوم شيء ما بإعداد تلك المعلمات وإجراء المكالمة، وهذا هو رمز بدء التشغيل. عند ترجمة وربط برنامج، فإن أحد معلمات الرابط هو نقطة الإدخال، وسيكون ذلك، اعتمادا على تطبيق وحدة التحكم أو واجهة المستخدم الرسومية، قليلا من رمز بدء التشغيل.

يمكنك بالتأكيد كتابة رمز بدء التشغيل الخاص بك، ما عليك سوى الدخول في دليل مصدر Visual C ++ الخاص بك ويمكنك العثور على رمز بدء التشغيل، وهو ما يسمى CRT0.C وهو في دليل VC CRT SRC.

نصائح أخرى

مع مجرد الرئيسية، لا يمكنك رمز winmain. للمبررات، تم أخذ البيانات التالية من http://blogs.msdn.com/oldnewghing/archive/2007/12/03/6644060.aspx.

في برمجة Windows،] لماذا لم يكن نقطة إدخال التطبيق يسمى الرئيسية؟ حسنا، لشيء واحد، تم أخذ الاسم الرئيسي بالفعل، ولم يكن لدى Windows سلطة حجز تعريف بديل. لم تكن هناك لجنة توحيد لغة C ثم؛ ج كان ما قاله دينيس إنه، ولم يكاد مضمون أن دينيس سيستغرق أي خطوات خاصة للحفاظ على توافق شفويات مصدر Windows في أي إصدار مستقبل من لغة C. نظرا لأن K & R لم تحدد أن التطبيقات يمكن أن تغطي الأشكال المقبولة من الوظيفة الرئيسية، إلا أنه كان من الممكن تماما أن يكون هناك مترجم قانوني C الذي رفض البرامج التي أعلنت أنها غير صحيحة بشكل غير صحيح. يسمح معيار اللغة C الحالية صراحة بالتعاريف البديلة الخاصة بالتنفيذ الخاصة بالتنفيذ الرئيسية، ولكن مطالبة جميع المحامرة بدعم هذا الإصدار الجديد الخاص ب Windows من أجل تجميع برامج Windows، من شأنه أن يؤدي إلى تقييد برامج Windows بشكل عام مجموعة من المحامرة التي يمكنك استخدامها لكتابة برامج Windows.

إذا تمكنت من التغلب على هذه العقبة، فستكون لديك مشكلة أن إصدار Windows من Main يجب أن يكون شيئا مثل هذا:

int main(int argc, char *argv[], HINSTANCE hinst,
         HINSTANCE hinstPrev, int nCmdShow);

نظرا للطريقة التي تم تنفيذ الربط c، كان على جميع أشكال الاختلافات في الوظيفة الموافقة على المعلمات التي كانت تشترك فيها. هذا يعني أن إصدار Windows سيضطر إلى إضافة معلماته إلى نهاية أطول إصدار موجود من Main، ثم يجب عليك عبور أصابعك ونأمل أن لا تضاف لغة C إصدار بديل آخر من Main. إذا ذهبت إلى هذا الطريق، فقد فشلك أصابعك المتقاطعة، لأنه اتضح أن المعلمة الثالثة تمت إضافتها إلى ما بعد بعض الوقت لاحقا، وتعارضت مع إصدار Windows الودي.

لنفترض أنك تمكنت من إقناع دينيس بعدم السماح بثلاثة المعلمات من Main. لا يزال يتعين عليك التوصل إلى تلك المعلمات الأولى، مما يعني أن رمز بدء تشغيل كل برنامج يحتاج إلى احتواء محلل سطر الأوامر. مرة أخرى في أيام 16 بت، الناس يهمهم لإنقاذ كل بايت. أخبرهم، "أوه، وجميع برامجك ستكون أكبر 2 كيلوبايت" ربما لن تجعلك الكثير من الأصدقاء. أعني، هذا أربعة قطاعات من I / O قبالة قرص مرن!

ولكن ربما السبب وراء إعطاء نقطة إدخال Windows اسم مختلف هو التأكيد على أنه بيئة تنفيذ مختلفة. إذا تم استدعاؤه الرئيسي، فسيقوم الأشخاص بتناول البرامج C مصممة لبيئة وحدة التحكم، ورميها في محمول Windows الخاص بهم، ثم قم بتشغيلها، مع نتائج كارثية.

آمل أن يزيل هذا شكوكك.

انها تعمل في الاتجاه الآخر. يوجد ملف كائن مرتبط ثابت يأتي مع برنامج التحويل البرمجي الذي يحمل نقطة الدخول الفعلية. تقوم نقطة الدخول هذه بالتهيئة ثم استدعاء نقطة الدخول الخاصة بك (أي WinMain).

ما يتوقعه هذا الجزء الثابت للاتصال بالتشغيل. على سبيل المثال، في Visual Studio، هناك حقل لاسم نقطة الإدخال في إعدادات رابط.

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