سؤال

بالنسبة الى باستخدام ضوابط تحرير ريتش أستخدم Richedit بهذه الطريقة:

MyControl::OnCreate()
{
    handle = LoadLibrary(_T("Riched20.dll"));
}

MyControl::OnDestroy()
{
    FreeLibrary(handle);
}

إنه يعمل بشكل جيد لـ Win32 ، لكنني قمت مؤخرًا ببناء تكوين X64 والآن يفشل التحكم بعد إعادة تحميل الصفحة.

alt text

لقد لاحظت أنه إذا فعل هذا:

MyControl::OnCreate()
{
    handle = LoadLibrary(_T("Riched20.dll"));
    FreeLibrary(handle);
    handle = LoadLibrary(_T("Riched20.dll"));
}

كل شيء يعمل بشكل جيد.

لا أرغب في وضع هذا الرمز في الإنتاج ، فهل هناك أي اقتراحات حول حل/حل أفضل؟

هل كانت مفيدة؟

المحلول

نظرًا لأن وحدة الصدع المبلغ عنها هي RichEdit20.dll_unloadt ، فهذا يعني أنك تقوم بتفريغ DLL بينما لا تزال الكود منها قيد الاستخدام.

على سبيل المثال ، إذا كان لا يزال لديك نافذة Richedit مفتوحة عندما تحرر (تمامًا) DLL ، فيمكنك رؤية حوادث مثل هذه بمجرد أن يؤدي أي شيء إلى مكالمة إلى نافذة عنصر التحكم. وذلك لأن نافذة التحكم كانت داخل رمز DLL الذي تم تفريغه.

يجب أن يكون من الآمن استدعاء مكتبة LoadLibrary و Freelibrary عدة مرات (طالما أن المكالمات توازن) ، لذلك أشك في أن هذه هي المشكلة. قد يكون مجرد إثارة المشكلة. أيضا ، كانت المشكلة هناك في بنيات 32 بت. لقد حالفك الحظ ولم تثيرها أبدًا.

Ondestroy هو المكان الخطأ لاستدعاء Freelibrary. هناك العديد من رسائل النوافذ التي يتم إرسالها إلى نافذة بعد WM_Destroy (على سبيل المثال WM_NCDESTROY).

لا تزال النوافذ الفرعية موجودة أيضًا عندما يتم استدعاء OnDestroy. إذا كان الغنيون هم أطفال من سيطرتك (بدلاً من السيطرة نفسها) ، فإن نقل المكتبة المستقلة إلى onncdestroy قد يوفر لك. (يتم تدمير نوافذ الأطفال بحلول الوقت الذي يتم فيه استدعاء WM_NCDESTROY.) ما زلت أقول إنه ليس مكانًا جيدًا لتحرير المكتبة.

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

(إذا كان تطبيقك نادرًا ما يستخدم عنصر التحكم فقط ، فقد يكون من المنطقي تحميل/تحرير المكتبة فقط عندما تكون Windows التي تستخدم عنصر التحكم نشطة. هذا الموقف أمر نادر الحدوث.

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