حالات الوحدة النمطية لـ DLL العادي المرتبط بـ MFC بشكل حيوي

القدرة على ربط DLL العادي بـ MFC DLL بشكل حيوي تسمح ببعض التكوينات المعقدة جداً. على سبيل المثال، يمكن ل DLL العادى و الملف القابل للتنفيذ الذى يستخدمه أن يرتبطا بشكل حيوى بـ MFC DLL و أى DLLs ملحقة.

هذا التكوين يسبب مشكلة بالنسبة إلى بيانات MFC العمومية، مثل المؤشر إلى كائن CWinApp الحالي و مخططات المعالجة.

قبل إصدار 4.0 من MFC ,البيانات العمومية هذه كانت موجودة في DLL MFC نفسه و كانت مشتركة بين كافة الوحدات النمطية في العملية. لأن كل عملية تستخدم DLL Win32 تحصل على نسخة خاصة بها من بيانات DLL, هذا المخطط يوفر طريقة سهلة لتعقب البيانات لكل عملية. أيضاً لأن طراز AFXDLL يُفترض أنه قد يكون هناك كائن CWinApp واحد فقط و مجموعة واحدة فقط من مخططات المعالجة في العملية ، فقد يتم تعقب هذه العناصر في DLL MFC نفسه.

ولكن من خلال القدرة على ربط DLL العادي بـ MFC DLL بشكل حيوي، يمكن الآن أن يوجد اثنان أو أكثر من كائنات CWinApp في عملية — و أيضاً مجموعتان أو أكثر من مخططات المعالجة. كيف يتمكن MFC من تعقّب أيهم ينبغى أن يستخدمه ؟

الحل هو إعطاء كل وحدة نمطية (تطبيق أو DLL عادي) نسخته من معلومات الحالة العمومية هذه. وبالتالي، استدعاء AfxGetAppفي DLL العادي يرجع مؤشراً إلى كائن CWinApp في DLL و ليس تلك الموجودة في الملف القابل للتنفيذ. تُعرف هذه النسخة لكل وحدة نمطية من البيانات العمومية MFC بـ"حالة الوحدة النمطية" و يتم شرحها فى ملاحظة فنية 58 لـ MFC.

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

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

ما الذى تريد معرفة المزيد حوله ؟

راجع أيضًا:

المبادئ

DLLs