بســـم الله الرحمــــــن الرحــــــيم
السلام عليكم,
لقد لاحظت في الفترة السابقة إن هنالك الكثير من الأشخاص الذين يعانون من مشكلة عدم عمل برامج ++Native C أو ++Unmanaged C المترجمة بإستخدام Visual Studio 2005 على بعض أجهزة الكومبيوتر لأسباب غامضة, لذلك فقد أرتأيت كتابة هذا الموضوع لتوضيح أسباب المشكلة وطرق حلها.
ما يمنع برنامج مكتوب بواسطة ++Native C و Visual Studio 2005 من العمل على كل الكومبيوترات هي مسألة لا تتعلق بأي شكل من الأشكال بالدوت نت (كما هو الرأي السائد), بل تتعلق بما يسمى Runtime Library (مكتبات التنفيذ أو التشغيل) والتي تمثل مجموعة من المكتبات التي يستخدمها أي برنامج مكتوب بواسطة ++C, مثل مكتبة الـ C Runtime Library أي CRT والتي تتضمن الكود المترجم للمكتبات الأساسية مثل stdio.h.
والآن, ستسأل ياترى لو كان الأمر كذلك لماذا إذن أي برنامج مكتوب بواسطة Visual C++ 6 لا يعاني من نفس المشكلة؟ والجواب بسيط! هو لأن مكتبات الـ Runtime التابعة لنسخة Visual C++ 6 والذي يعود أصلاً إلى سنة 1998 جميعها موجود أصلاً في جميع إصدارات وندوز المستخدمة حالياً لأن أغلب برامج وندوز نفسه تحتاجها!
أما مكتبات التشغيل التابعة للـ Visual Studio 2005 الجديد نسبياً فهي ليست موجودة في أنظمة الوندوز المستخدمة أصلاً (خاصة الوندوز XP الأكثر إستخداماً)... لذلك فإن أي برنامج مترجم بإستخدام 2005 سيعترض على عدم وجود تلك المكتبات برسالة غامضة تتحدث عن إعدادات غير صحيحة ولا تقدم أي دليل واضح عن نوع الخطأ.
عادة ما تكون واحدة من هذه الرسائل إستناداً إلى نسخة الوندوز التي لديك:
The application failed to initialize properly (0xc0000135
This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem
The system cannot execute the specified program
أما عن الإفتراض السائد بأن عدم وجود مكتبة دوت نت هو السبب؛ فذلك غير صحيح, والسبب الوحيد الذي يجعل تثبيت دوت نت يحل المشكلة هو لأن الدوت نت نفسه سيثبت مكتبات التشغيل إذا لم تكن موجودة في النظام (سأشرح لاحقاً كيف يمكن جعل برنامج التثبيت الخاص بك يبحث عن وجود مكتبات التشغيل التي يحتاجها ويقوم نفسه بتثبيتها في حالة عدم وجودها, ذلك إن كان هنالك أحد ما يرغب في معرفة كيفية القيام بذلك).
1) تستطيع أن تضع مع برنامجك ملف لتثبيت مكتبات التشغيل الخاصة بـ Visual Studio 2005, وهو مقدم من Microsoft وأصغر وأخف بكثير من تثبيت NET Framework. بكامله, تستطيع تنزيله من هنا (الحجم: 2.6 MB).
2) تستطيع إذا كنت تعرف ماهي مكتبات التشغيل التي التي تستخدمها بالضبط أن ترفق ملفات الـ DLL لتلك المكتبات مع برنامجك في نفس مجلد ملف التنفيذ.
3) تستطيع جعل برنامج التثبيت Setup (الذي يمكن إنشاءه كجزء من مشروعك في Visual Studio 2005) يفحص ما إذا كانت مكتبات التشغيل موجودة أم لا ويقوم بتثبيتها في حالة عدم وجودها, سأشرح هذه الطريقة إذا رغب أحدكم بذلك.
4) الطريقة المثلى التي توصلت إليها بسيطة جداً! بدل إستخدام إسلوب ربط ديناميكي Dynamic Linking والذي سيحتاج مكتبات ربط ديناميكية كملفات منفصلة DLL قد تكون غير موجودة في النظام (وهذا هو أساس المشكلة) لماذا لا نستطيع الربط للمكتبات المطلوبة بشكل ثابت Static؟ (وذلك يعني تضمين الملفات التي يحتاجها برنامجك كجزء منه) حينها لن يحتاج البرنامج أي ملفات تشغيل خارجية وتعقيدات تثبيت وما إلى ذلك وحينها أيضاً لن تكون هنالك مشكله لأن سببها إختفى!. تصورت قبل أن أجرب هذه الطريقة إن إستخدامها سيزيد من حجم الملف التنفيذي المتولد بمقدار 1 ميغابايت على الأقل. ولكن تعجبت عندما رأيت إن الزيادة الفعلية لا تتجاوز 120 كيلوبايت لبرنامج Win32 إعتيادي! طبعاً إستخدام مكتبات إضافية مثل MFC وما إلى ذلك سيضيف إلى حجم الملف, ولكني لا أعتقد إن الزيادة ستكون كبيرة.
خطوات جعل البرنامج يربط بشكل Static لجميع مكتبات التشغيل التي يحتاجها:
- من مشروعك في Visual Studio 2005, إدخل إلى خصائص المشروع (Project->Properties).
- إدخل إلى قسم Configuration Properties.
- قم بتغيير Use of ATL من Not Using ATL إلى Static Link to ATL
- الآن قم بتغيير Minimize CRT Use in ATL من No إلى Yes
إنتهى! الآن قم بترجمة وبناء برنامجك من جديد, يمكن الآن تشغيل البرنامج الناتج على أي كومبيوتر يعمل بنظام وندوز من دون الحاجة إلى أي ملفات تشغيل مثبته مسبقاً.
وشكراً لكم :)
-waf

