انتهاك الوصول عند تشغيل تطبيق C ++ الأصلي الذي يستخدم A /CLR DLL

StackOverflow https://stackoverflow.com/questions/2645961

  •  27-09-2019
  •  | 
  •  

سؤال

أقوم بإعادة تنظيم تطبيق Legacy مختلط (DLLs المدارة وغير المُدار) بحيث يكون قطاع التطبيق الرئيسي هو MFC غير مُدارة والذي سيطلق على DLL C ++ DLL مع علامة CLR التي ستجسر الاتصال بين المدار (C# DLLs) والرمز غير المُدار . من غير المعتاد ، أدى تغيير بلدي إلى انتهاك للوصول الذي يحدث قبل أن يسمى التطبيق initinstance (). هذا يجعل من الصعب للغاية تصحيح. المعلومات الوحيدة التي أحصل عليها هي تتبع المكدس التالي.

>   64006108()  
ntdll.dll!_ZwCreateMutant@16()  + 0xc bytes 
kernel32.dll!_CreateMutexW@12()  + 0x7a bytes   

لذلك ، إليك بعض sceanrios التي جربتها.
-تم تشغيله على استثناءات-> استثناءات Win32-> C0000005 انتهاك الوصول للكسر عند إلقاؤه. لا يزال معظم التفاصيل التي أحصل عليها هي من تتبع المكدس أعلاه. لقد جربت التطبيق باستخدام F10 ، لكنه يفشل قبل أن يتم ضرب أي نقاط توقف وتفشل مع تتبع المكدس أعلاه.

- لقد قمت بإعداد الجسر DLL بحيث لا يحتوي إلا على طريقة واحدة تُرجع منطقة ويتم ترميز هذه الطريقة لإرجاع FALSE (لا يوجد رمز C# يسمى).

bool DllPassthrough::IsFailed() { return false; }

إذا تم تجميع DLL خارج DLL باستخدام علامة /clr ، فإن التطبيق يفشل. إذا تم تجميعه بدون علامة /clr ، يتم تشغيل التطبيق.

- لقد قمت بإنشاء تطبيق MFC باستخدام معالج Visual Studio للتطبيقات متعددة الحوليات واتصل DLLPASSTHOUGH :: ISFAILED (). هذا ينجح حتى مع علامة /clr المستخدمة لتجميع DLL.

- لقد حاولت القيام بمحمل يدوي على Winmm.Lib كما هو موضح في المذكرة التالية انتهاك الوصول عند استخدام C ++/CLI. التطبيق لا يزال فشل.

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

شكرًا. راجع للشغل ، نحن نستخدم Visual Studio 2008 ويتم بناء المشروع مقابل إطار .NET 2.0 للأقسام المدارة.

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

المحلول

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

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