Вопрос

Я пытаюсь создать исполняемый файл C++/CLI, к которому статически привязываю ffmpeg (libavcodec, libavformat, libavutil и swscale).Он работает нормально, если я его собираю нормально (без /clr, поэтому нет поддержки CLR), он работает.Однако когда я добавляю поддержку CLR, она не запускается с 0xc000007b.Однако приложение C++/CLI «Hello World» работает нормально.

Предположительно то же самое происходит с Boost::Threads, но поскольку ffmpeg — это чистый C, я сомневаюсь, что он использует Boost.

Моя конфигурация:

  • Visual Studio 2008 Профессиональный пакет обновления 1 (SP1)
  • Windows XP Pro SP3 (x86)
  • .NET Framework 3.5 с пакетом обновления 1

Спасибо, Роберт

Это было полезно?

Решение

Возможно, он не использует boost, но, вероятно, использует потоки и локальное хранилище потоков, что приводит к той же проблеме.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