الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة برامج Visual Studio 2005 و مكتبات التنفيذ

بدأه SandHawk في 5 سبتمبر 2007 · 12 رد · 6,660 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بســـم الله الرحمــــــن الرحــــــيم

السلام عليكم,

لقد لاحظت في الفترة السابقة إن هنالك الكثير من الأشخاص الذين يعانون من مشكلة عدم عمل برامج ++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.

post-115785-1188952832_thumb.jpg

  • قم بتغيير Use of ATL من Not Using ATL إلى Static Link to ATL

post-115785-1188952889_thumb.jpg

  • الآن قم بتغيير Minimize CRT Use in ATL من No إلى Yes

post-115785-1188952911_thumb.jpg

إنتهى! الآن قم بترجمة وبناء برنامجك من جديد, يمكن الآن تشغيل البرنامج الناتج على أي كومبيوتر يعمل بنظام وندوز من دون الحاجة إلى أي ملفات تشغيل مثبته مسبقاً.

وشكراً لكم :)

-waf

تم تعديل هذه المشاركة بواسطة SandHawk في 5 سبتمبر 2007 في 03:49

#2

,وعليكم السلام ,

ياعيني عليك .. كنت أريد أن اسأل عن هذه المشكلة ..

عملت عدة تطبيقات .. بالفيجوال 2005 .. قبل ثلاثة أيام فقط .. وحاولت انقلها لكمبيوتر اخر لايحتوي طبعا على المترجم ,, ولم تكن تعمل ,,

اضطررت عندها الى اعادة ترجمة تلك الملفات بالCodeBlocks الذي يعتمد على مترجم غير الفيجوال طبعا ,, وعملت تلك الملفات التنفيذية .

لكن ماذا عن الملف XXX.exe.intermediate.manifest

الذي ينتجه المترجم وستجده مع الملف التطبيقي .. حيث XXX هو اسم البرنامج .

هل تضمين هذا الملف مع الملف التطبيقي .. سيجعله يعمل ... أعتقد نعم .. ولست متأكد 100 % .. ولكن أظن والله أعلم اني قمت منذ فترة طويلة بتجريب هذه الطريقة وعمل الملف التنفيذي . . سأتأكد من هذه الطريقة وسأرد عليك .. هل لديك اي معلومة عن ذلك الملف .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

السلام ..

رائع ماتوصلت له أخي الكريم ولكن هل ينطبق هذا فقط على ++Native C أو ++Unmanaged C

أم أنه ينطبق على كافة البرامج المنشأة بالفيجوال ستوديو 2005 وبأي بغة برمجية

#4

أهلاً بك أخي الشمري,

الـ manifests هي أحد الأشياء التي لم أفهم تماماًً ما فائدتها, لذلك فقد ذهبت في رحلة بحث عن الحقيقة :D

1.

Manifest Generation in Visual Studio

2.

Understanding Manifest Generation for C/C++ Programs

3.

Concepts of Isolated Applications and Side-by-side Assemblies

4.

Assembly Searching Sequence

ما وجدته هو الآتي, جميع البرامج التي تستخدم مكتبات التشغيل الأساسية على Visual Studio 2005 تقوم تلقائياً بعمل دمج (Embed) لملف الـ manifest لكي يكون جزءاً من الملف المنشأ (binary), ويمكن جعله بشكل ملف منفصل بإمتداد manifest عند الحاجة, كما إن مهمة الـ manifest هي تحديد المكتبات Assemblies المطلوبة والإصدارات المطلوبة لتلك المكتبات, حيث سيقوم الوندوز بعدها بعمليات بحث عن هذه المكتبات حسب آلية محددة مشروحة بالتفصيل في رابط 4 أعلاه, لذلك فلا أعتقد إن إستخدام الـ manifest لوحده ممكن أن يحل المشكلة, إلاّ إذا تم وضع المكتبات المطلوبة في مسار سيبحث عنه الوندوز.

الـ manifest كذلك هو ملف XML نصي, مثال لـ manifest تابع لمشروع HelloWorld:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
	<dependentAssembly>
	  <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
	</dependentAssembly>
  </dependency>
</assembly>

طريقة تغيير حالة دمج ملف الـ manifest: من Project -> Properties من قسم Configuration Properties, من التفرع Manifest Tool إختر Input and Ouput. يمكن تغيير حالة الدمج من Embed Manifest (القياسي Yes).

سأقوم ببعض التجارب لكي أتأكد ما إذا كان من الممكن للـ manifest أن يحل المشكلة, شكراً لك لفتح باب النقاش :)

(وبالمناسبة, لقد إشتريت شاشة جديدة وأخيراً يوم أمس ;) )

مبرمجة4: نعم, ينطبق هذا فقط على Native, أما الـ Managed فهو سيحتاج دوت نت دائماً وليس هنالك حل آخر.

وحسب علمي, فإن اللغة الوحيدة من اللغات المدعومة من قبل Visual Studio 2005 التي تستخدم عادة لبناء برامج Native هي ++C, أما بقية اللغات (#C, وVB, و#J) فهي تستخدم لبناء برامج دوت نت رغم إنه من الممكن بناء Native بإستخدامهم, إلا إن ذلك نادر.

شكراً لكم :)

تم تعديل هذه المشاركة بواسطة SandHawk في 5 سبتمبر 2007 في 20:35

#5

السلام عليكم و رحمة الله و بركاته

أبسط أستخدام لل manifests هو تدعيم شكل ال xp و لا أعتقد أنه يؤثر علي التشغيل في الحالات العادية

ملاحظة : MinGW لا يحتاج لمكتبات غير الموجوده في النظام أساسا في الحالات العادية و في حالة عدم أستخدام دوال من داخله و أزي حدث فأن المكتبة المطلوبة تكون mingwm10.dll

عمرو عيسي

#6

السلام عليكم ..

المشكلة أيضا مع VC 2008 ..

عندما أقوم بترجمة الكود .. ينتج لي ملف EXE .. وعندمااشغله على جهاز لايحوي .. vc 2008 فانه لا يشتغل ..

لايوجد في vc 2008 مثل الخيار الذي ذكرت أخي سلوان

اقتباس
لآن قم بتغيير Minimize CRT Use in ATL من No إلى Yes

يوجد حل ..وهو ينجح احيانا .. ويفشل أحيانا اخرى .

post-42837-1217515185.jpg

الحل هو بتغيير خيارات run-time lib .. الى Multi Threading

يفشل تحديدا اذا استخدمت مكتبات أخرى مثل SDL .. أعتقد السبب أنه تلك المكتبات مبنية بنظام يختلف .. مثل Multi threaded DLL و أنا استخدم Multi threaded ..

ماهي الطريقة لدمج المكتبات المطلوبة مع التطبيق ستاتيكيا .. أو ديناميكيا .

تم تعديل هذه المشاركة بواسطة الشمري في 31 يوليو 2008 في 17:43

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

السلام عليكم ورحمة الله وبركاته

ومن الاخطاء ايضا التي تؤدي لعدم تشغيل البرنامج على اي جهاز اخر

هو ارسال البرنامج الموجود بمجلد Debug الى الجهاز الاخر

بينما يجب ارسال البرنامج الموجود بمجلد Release

وقمت بتجربة هذا بنفسي

#8

وعليكم السلام ورحمه الله وبركاته,

الشمري كتب:
ماهي الطريقة لدمج المكتبات المطلوبة مع التطبيق ستاتيكيا .. أو ديناميكيا .

في الحقيقة لا زلت أستخدم VS2005, لذلك فليست لدي معلومات عن كيفية عمل نفس المهمة في VS2008, ولكن عموماً, قلت إن خيار Minimize CRT Use in ATL غير موجود, ولكن ماذا عن الخيار الآخر وهو الأهم: Static link to ATL؟

على كل حال, فإنك تستطيع إرفاق ملفات الـ DLL التابعه لـ Visual Studio 2008 يدوياً مع ملف EXE, تلك الملفات من المفترض أن تكون:

  • Microsoft.VC90.CRT.manifest
  • msvcm90.dll
  • msvcp90.dll
  • msvcr90.dll

وبالتأكيد هذه الملفات مخصصة لملفات EXE المبنية كـ Release ولا تعمل مع Debug.

من تجاربي العملية, أحياناً حتى وإن إستخدمت طريقة ربط static من داخل VS2005, يحصل الخطأ نفسه, يبدو إن المكتبات التي يتم الربط الستاتيكي لها هي ليست نفسها المكتبات المنفصلة, أو إن المكتبات المنفصلة تحتوي على اجزاء أكثر بشكل أو بآخر (قد يكون سبب حدوث ذلك هو تشغيل خيار Minimize CRT Use in ATL؟), لذلك فأوصي بإرفاق الملفات الآنف ذكرها دائماً للإحتياط.

ومن نظرة سريعة على ملفات الـ DLL لبعض البرامج المعروفة مثل 3D Studio MAX, و Photoshop لاحظت إنهم يستخدمون الطريقة نفسها, أي يرفقون تلك الملفات محلياً مع ملفات EXE التابعة لبرامجهم, تحديداً ملفي vcp و vcr (أو vcrt), كذلك معظم الألعاب! تقوم بإرفاق نفس الملفات, يبدو إننا لسنا الوحيدين الذين يواجهون هذه المشكلة. :wink:

تم تعديل هذه المشاركة بواسطة SandHawk في 1 أغسطس 2008 في 17:36

#9

شكراً لك يا سلواان..:)

لكن هل هذه الطريقة تنفع لـ2008؟؟

#10

شكرا لك أخي سلوان .. ارفقت الملفات المطلوبة

* Microsoft.VC90.CRT.manifest

* msvcm90.dll

* msvcp90.dll

* msvcr90.dll

واللعبة تعمل بنجاح .. نعم .. انها binary land .. :D

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#11
مدمن ++C كتب:
شكراً لك يا سلواان.. :)

لكن هل هذه الطريقة تنفع لـ2008؟؟

العفو :P

للأسف ليس لدي VS2008 لأجرب.

تعديل:

الشمري كتب:
شكرا لك أخي سلوان .. ارفقت الملفات المطلوبة

* Microsoft.VC90.CRT.manifest

* msvcm90.dll

* msvcp90.dll

* msvcr90.dll

واللعبة تعمل بنجاح .. نعم .. انها binary land ..

جيد جداً :D

تم تعديل هذه المشاركة بواسطة SandHawk في 2 أغسطس 2008 في 14:18

#12

السلام عليكم،

جزاك الله خيرا اخي على هذه المعلومات.

اقتباس
1) تستطيع أن تضع مع برنامجك ملف لتثبيت مكتبات التشغيل الخاصة بـ Visual Studio 2005, وهو مقدم من Microsoft وأصغر وأخف بكثير من تثبيت NET Framework. بكامله, تستطيع تنزيله من هنا (الحجم: 2.6 MB).

هل يوجد امر مماثل مع لغة السي شارب ؟؟

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#13
الاخير زمانه كتب:
السلام عليكم،

جزاك الله خيرا اخي على هذه المعلومات.

هل يوجد امر مماثل مع لغة السي شارب ؟؟

وعليكم السلام ورحمه الله,

كلا, بالنسبة للغة سي شارب التي تستخدم إطار عمل دوت نت (C# .NET) وكذلك سي ++ التي تستخدم إطار عمل دوت نت (C++ .NET), ستحتاج الـ NET Framework. بكامله.

أعتذر عن التأخر في الإجابة. :blush:

مواضيع مشابهة