سؤال

أحاول إنشاء ملف C++/CLI قابل للتنفيذ وأربط به بشكل ثابت ffmpeg (libavcodec، libavformat، libavutil & swscale).إنه يعمل بشكل جيد إذا قمت بإنشائه بشكل طبيعي (بدون /clr، لذلك لا يوجد دعم CLR)، فهو يعمل.ومع ذلك، عندما أقوم بإضافة دعم CLR، فإنه لن يبدأ بـ 0xc000007b.ومع ذلك، فإن تطبيق "Hello World" C++/CLI يعمل بشكل جيد.

من المفترض أن يحدث نفس الشيء مع Boost::Threads، ولكن نظرًا لأن ffmpeg هو C خالص، أشك في أنه يستخدم Boost.

التكوين الخاص بي:

  • فيجوال ستوديو 2008 بروفيشنال SP1
  • ويندوز إكس بي برو SP3 (x86)
  • صافي الإطار 3.5 SP1

شكرا ، روبرت

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

المحلول

قد لا يستخدم التعزيز، لكنه ربما يستخدم سلاسل الرسائل والتخزين المحلي، مما يؤدي إلى نفس المشكلة.CLR غير متوافق مع __declspec(thread).أعتقد أنه لا يوجد حل بديل بسيط، إلا إذا كنت على استعداد لتعديل كود ffmpeg (إذا كنت كذلك، فابحث في Google عن هذه الكلمات الرئيسية للحصول على أمثلة:clr، __declspec(موضوع) ).

أقترح عزل ffmpeg في عملية مختلفة واستخدام بعض وسائل الاتصال بين العمليات.

نصائح أخرى

لقد رأيت مشكلة مماثلة تتعلق بـ DirectEditServices.انتهى الحل إلى أن يكون مرتبطًا بنوع Thread Apartment.في .Net 2.0 والإصدارات الأحدث، تم تبديل نوع قسم مؤشر الترابط الافتراضي من STA إلى MTA.بعض كائنات C++ الأصلية لا تدعم MTA.لقد نجحت في إنشاء سلسلة رسائل وتعيين نوع الشقة يدويًا على STA.ضع في اعتبارك أن أي اتصالات بين العمليات مع كائن C++ أصلي لا يدعم STA يجب أن تحدث على مؤشر ترابط STA الذي يقوم بإنشاء مثيل للكائن.

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