1

我正在尝试构建一个 C++/CLI 可执行文件,我将 ffmpeg(libavcodec、libavformat、libavutil 和 swscale)静态链接到该可执行文件。如果我正常构建它(没有 /clr,所以没有 CLR 支持),它可以正常工作,它可以工作。但是,当我添加 CLR 支持时,它不会以 0xc000007b 启动。不过,“Hello World”C++/CLI 应用程序运行良好。

据说 Boost::Threads 也会发生同样的事情,但由于 ffmpeg 是纯 C 语言,我怀疑它是否使用了 Boost。

我的配置:

  • Visual Studio 2008 专业版 SP1
  • Windows XP 专业版 SP3 (x86)
  • .NET 框架 3.5 SP1

谢谢,罗伯特

4

2 回答 2

2

它可能不使用 boost,但它可能使用线程和线程本地存储,这会导致同样的问题。CLR 与 __declspec(thread) 不兼容。我相信没有简单的解决方法,除非您愿意修改 ffmpeg 代码(如果您愿意,请在谷歌上搜索这些关键字,例如:clr、__declspec(thread))。

我建议将 ffmpeg 隔离在不同的进程中,并使用某种进程间通信方式。

于 2009-08-10T21:04:24.503 回答
2

我见过一个涉及 DirectEditServices 的类似问题。该解决方案最终与 Thread Apartment 类型相关。在 .Net 2.0 及更高版本中,默认线程单元类型从 STA 切换到 MTA。一些本机 C++ 对象不支持 MTA。我通过产生一个线程并将公寓类型手动设置为 STA 取得了成功。请记住,与不支持 STA 的本机 C++ 对象的任何进程间通信都必须发生在实例化对象的 STA 线程上。

于 2009-08-28T15:38:12.940 回答