سؤال

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

يجب أن تقوم وظيفة نقطة الدخول فقط بأداء مهام التهيئة البسيطة ويجب عدم استدعاء أي وظائف تحميل DLL أو الإنهاء الأخرى. على سبيل المثال، في وظيفة إدخال نقطة الدخول، يجب ألا نستدعي وظيفة LoadLibrary مباشرة أو غير مباشرة أو وظيفة LoadLibraryEx. بالإضافة إلى ذلك، يجب عدم استدعاء الدالة Frelibrary عند إنهاء العملية.

إليك الرمز المخالف. هل يمكن لشخص ما يفسر السبب في أنني لا يجب أن أتصل ب LoadLibrary و Freelibrary من نقطة الدخول DLL الخاص بي؟

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
switch (ul_reason_for_call) {
    case DLL_PROCESS_DETACH :
            if (hLogLib != NULL) FreeLibrary(hLogLib);
            break;
    }
    return TRUE;
}
هل كانت مفيدة؟

المحلول

أعتقد أنني وجدت الاجابة.

يجب أن تؤدي وظيفة الدخول إلى مهام التهيئة أو الإنهاء البسيطة فقط. يجب عدم استدعاء وظيفة LoadLibrary أو LoadLibraryEx (أو وظيفة تستدعي هذه الوظائف)، لأن هذا قد يخلق حلقات التبعية في ترتيب تحميل DLL. يمكن أن يؤدي ذلك إلى استخدام DLL قبل تنفيذ النظام رمز التهيئة الخاص به. وبالمثل، يجب عدم استدعاء وظيفة الدخول إلى وظيفة Frelibrary (أو دالة تستدعي Freelibrary) أثناء إنهاء العملية، لأن هذا يمكن أن يؤدي إلى DLL يستخدم بعد تنفيذ النظام رمز إنهاءه.

نصائح أخرى

لا يمكنك الاتصال LoadLibrary من نقطة الإدخال الخاصة بك لأن وظيفة DLLMain تعمل داخل قفل OS Loader وأي محاولات رائدة في أن قفل Loader (على سبيل المثال، عن طريق الاتصال LoadLibrary) سيؤدي إلى طريق مسدود.

لا تفعل أي شيء من النتيجة داخل dllmain. عنجد. استدعاء frelibrary هو أسوأ أن يكون فقط بعض الأحيان Readlock، إذا حدث ذلك، فإن إجراءاتك مجانية من Refcount إلى الصفر والمكتبة تحريرها بالفعل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top