أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

PRB: للطلب LoadLibrary() تحميل DLL التي تم TLS الثابتة

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

اضغط هنا لرابط المقالة باللغة الانجليزية118816
الأعراض
مكتبة الارتباط الحيوي (DLL) تستخدم __declspec (مؤشر ترابط) تخصيص تخزين محلي مؤشر ترابط ثابت (TLS). لا توجد أية مشاكل المقترنة تشغيل تطبيق المرتبط مع مكتبة ثابتة المطابق. ومع ذلك، عند تطبيق دالة LoadLibrary تحميل DLL بدلاً من استخدام الإصدار ثابتة LoadLibrary فشل واحد على Win32s مع رمز خطأ 87: معلمة غير صالحة.

نجاح LoadLibrary على جهاز كمبيوتر يعمل بنظام التشغيل Windows 98 أو Windows NT أو Windows 2000 في هذا الموقف. ومع ذلك، يتم تعريف سلوك استدعاء الدالات في DLL التي تشير إلى متغيرات TLS ثابتة. في Microsoft Windows 95 و فشل LoadLibrary و GetLastError تعمل إرجاع 1114 - ERROR_DLL_INIT_FAILED (ارتباط حيوي مكتبة إجراء تهيئة فشل). نجاح الدالة LoadLibrary على نظام التشغيل Windows 2000. على الرغم من ذلك، يسبب أي محاولة لإعادة الوصول إلى البيانات TLS خرق في وصول (AV).
السبب
هذا وجود قيود LoadLibrary__declspec. يتم تخصيص مساحة متغير عمومي لمؤشر ترابط وقت التشغيل. يستند الحجم حساب متطلبات التطبيق بالإضافة إلى متطلبات المكتبات التي تم ربطها بشكل ثابت. إذا DLL يستخدم TLS ثابتة هو مرتبطة الحيوي في أحد تطبيقات عندما يتم استدعاء LoadLibrary أو FreeLibrary يجب على النظام إيجاد كافة مؤشرات الترابط التي توجد في العملية تكبير أو ضغط ذاكرة TLS الخاصة بهم استناداً إلى حجم TLS ثابتة في DLL تحميل حديثاً. هذه العملية مقدار كبير جداً بالنسبة لأنظمة التشغيل لإدارة, مما يمكن أن يؤدي إلى حدوث استثناء إما عندما يتم تحميله بشكل حيوي DLL أو التعليمات البرمجية مراجع البيانات.
الحل
يجب أن لا يمكن تحميل DLL التي تستخدم __declspec (مؤشر ترابط) مع LoadLibrary.

يجب أن يتم تعديل التعليمات البرمجية DLL لاستخدام مثل دالات TLS TlsAlloc و تخصيص TLS إذا فقد يتم تحميل DLL مع LoadLibrary. أو DLL الذي يستخدمه __declspec (مؤشر ترابط) يجب فقط يمكن ضمنيًا تحميل إلى التطبيق.
معلومات أخرى
لتحديد ما إذا كان ملف DLL يستخدم TLS ثابتة يمكن استخدام الأداة Dumpbin.exe تفريغ معلومات الرأس. يحتوي ملف DLL TLS ثابتة إذا كانت "قيم الرأس اختياري" تحتوي على حجم أكبر من 0 (صفر) في "خدمة التخزين مؤشر ترابط" كما يلي:
517B20 [18] RVA [حجم] لدليل التخزين مؤشر الترابط
1.10 1.20 3.50

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 118816 - آخر مراجعة: 11/21/2006 15:29:52 - المراجعة: 3.2

Microsoft Win32 واجهة برمجة تطبيقات

  • kbmt kbdll kbkernbase kbprb kbthread KB118816 KbMtar
تعليقات
> l>=">