سؤال

لوصف المشكلات التي أواجهها سوف تستغرق وقتًا طويلاً ، لكن المشكلة في النهاية الحادة هي:

  1. فشل LoadLibraryw (إرجاع Nullptr) عند إعطاء مسار صالح.

  2. تقوم Process Monitor بتسجيل أي إخفاقات مشبوهة ، أو في الواقع أي شيء مختلف عن عندما ينجح في تحميل DLL (والذي يمكنه في سياق آخر).

  3. DLL ليس لديه تبعيات غير نظام.

  4. ... والأسوأ من ذلك كله ، رمز خطأ Windows الذي تم إرجاعه بواسطة GetLasterror هو 3221225619.

على افتراض أن 32212225619 ليس رمز خطأ صالح ، فما الذي يمكن أن يحدث لدرجة أن Windows ليس لديه رمز خطأ له؟

تعديل:

أعتقد أن بعض الناس أرادوا مزيدًا من التفاصيل حول الفشل نفسه:

  • لا يبدو أنه الإدخال - وهو متطابق في الإصدار العامل والفشل ، وقد أعلن LoadLibraryw بنجاح "الملف غير موجود" عندما يتم تشويه سلسلة الإدخال. المدخلات الحالية قد تم ترميزها بقوة ، وترك مساحة صغيرة للخطأ.
  • يتم تجميع DLL في الإصدار ورمز الاتصال في Debug. لقد كنت أفعل هذا لمدة 18 شهرًا دون مشكلة ، لكنك لا تعرف أبدًا.
  • تقارير حزمة مراقبة العملية عن حوالي 30 عملية داخلية تعمل داخل LoadLibraryw ، بما في ذلك CreateFile و LoadImage و RegopenKey. هؤلاء هم مطابق لمكالمة العمل والمكالمة الفاشلة ، وصولاً إلى أحجام الملفات ومواقع الذاكرة.
  • لا يوجد أي فساد واضح للذاكرة في كائن C ++ الذي يطلق عليه ، وكما قلت ، يعطي Process Monitor نفس عنوان الصورة الأساسية في كلتا الحالتين.
  • فشل الفشل بنسبة 100 ٪ - في نفس الوقت ، نفس المكان في كل مرة.
هل كانت مفيدة؟

المحلول

آسف ، هذا ليس بالضبط إجابة ، ولكن تم حل المشكلة.

بادئ ذي بدء ، لقد لاحظت للتو سؤالًا مشابهًا هنا: C ++ LoadLibrary () خطأ 3765269347. أعتقد أن هذا يعطي المزيد من التفاصيل ، ويستحق نظرة إذا كنت في وضع مشابه لما كنت عليه.

شكري لـ whozcraig و danieldaranas وأي شخص آخر أدلى بتعليقات مفيدة. بالنسبة للأشخاص الآخرين الذين يقرؤون هذا ، هناك مقال جيد عن Hresult يتوسع في نقاطهم في ويكيبيديا: http://en.wikipedia.org/wiki/Hresult.

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

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

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