سلوك مكتبة وقت التشغيل

تقوم التعليمات البرمجية الخاصة بمكتبة وقت تشغيل C/C++ بتنفيذ تسلسل بدء تشغيل DLL، مما يلغي الحاجة إلى الربط مع وحدة نمطية منفصلة كما كان ضرورياً في Windows 3.x. مما تم تضمينه في التعليمات البرمجية الخاصة بمكتبة وقت تشغيل C/C++ هو دالة نقطة إدخال DLL التى تسمى _DllMainCRTStartup . تقوم دالة _DllMainCRTStartup بالعديد من الأشياء بما في ذلك استدعاء _CRT_INIT ، الذي يقوم بتهيئة مكتبة وقت تشغيل C/C++ و استدعاء مُنشئات C++ على متغيرات ثابتة غير محلية. بدون هذه الدالة، سوف يتم ترك مكتبة وقت التشغيل في حالة غير مهيأة. _crt_init متوفرة لكل من CRT المرتبطة بشكل ثابت أو المرتبطة بـ DLL CRT المسمى Msvcr90.dll من DLL المستخدم .

فى حين أنه من الممكن تحديد دالة نقطة إدخال أخرى باستخدام /ENTRY: خيار الرابط ، لا ينصح به لأن دالة نقطة الإدخال الخاص بك ستضطر لتكرار كل شيئ يقوم به _DllMainCRTStartup . عند بناء DLLs في Visual C++ ، يتم ربط _DllMainCRTStartup فيها تلقائياً و لا تحتاج إلى تحديد دالة نقطة إدخال باستخدام /ENTRY : خيار الرابط.

بالإضافة إلى تهيئة مكتبة وقت تشغيل C ،تقوم _DllMainCRTStartup باستدعاء دالة تسمى DllMain. اعتماداً على نوع DLL الذي تقوم ببنائه، فإن Visual C++ يوفر DllMain لك و يقوم بربطه فيه بحيث يحتوي _DllMainCRTStartup دوماً على شيء يُستدعى. بهذه الطريقة، إذا لم تكن في حاجة إلى تهيئة DLL الخاص بك, لا يوجد أي شيء خاص يتوجب عليك فعله عند بناء DLL الخاص بك. إذا كنت تحتاج إلى تهيئة DLL، مكان إضافتك للتعليمات البرمجية الخاصة بك يعتمد على نوع DLL الذى تكتبه. لمزيد من المعلومات، راجع تهيئة DLL.

تستدعى التعليمات البرمجية الخاصة بمكتبة C/C++ دالات الإنشاء و التدمير على متغيرات ثابتة غير محلية. على سبيل المثال، في مكتبة الارتباط الديناميكي بالتالي المصدر تعليمات برمجية، ثابتة، غير محلية كائنين من فئة Equus، المعرفة في Horses.h.SugarوCHorse هناك هو لا يوجد دالة في تعليمات برمجية المصدر التي تحتوي على استدعاءات دالة الدالة الإنشائية ل CHorseأو في destructor تعمل لأنه يتم تعريف هذه الكائنات خارج أي دالة. لذلك، يجب إجراء الاستدعاءات إلى دالات الإنشاء و التدمير هذه بواسطة التعليمات البرمجية وقت التشغيل. التعليمات البرمجية لمكتبة وقت تشغيل الخاصة بالتطبيقات تُنفذ أيضاً هذه الدالة.

#include "horses.h"

CHorse  Equus( ARABIAN, MALE );
CHorse  Sugar( THOROUGHBRED, FEMALE );

BOOL    WINAPI   DllMain (HANDLE hInst, 
                            ULONG ul_reason_for_call,
                            LPVOID lpReserved)
...

كلما حاولت عملية جديدة استخدام الـ DLL ، ينشئ نظام التشغيل نسخة منفصلة من بيانات هذا الـ DLL : يسمى هذا إرفاق عملية . التعليمات البرمجية لمكتبة وقت التشغيل الخاصة DLL تستدعى دالات الإنشاء لكافة الكائنات العامة, فى حال وجود أى منها, ثم تستدعى الدالة DllMain مع تحديد إرفاق العملية. الموقف المعاكس هو فصل العملية: تقوم التعليمات البرمجية لمكتبة وقت تشغيل باستدعاء DllMain مع تحديد فصل العملية، ثم تستدعى قائمة دالات الإنهاء بما في ذلك دالات atexit و دالات التدمير للكائنات العامة و دالات التدمير للكائنات الثابتة. لاحظ أن ترتيب الأحداث فى إرفاق العملية هو عكس الذي في فصل عملية .

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

ما الذي تريد عمله؟

راجع أيضًا:

المبادئ

DLLs