【问题标题】:C++/CLI -- 0xc000007b (INVALID_IMAGE_FORMAT) with /clr option onC++/CLI -- 0xc000007b (INVALID_IMAGE_FORMAT) 带有 /clr 选项
【发布时间】:2010-11-16 21:57:30
【问题描述】:

我正在尝试构建一个 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 Pro SP3 (x86)
  • .NET Framework 3.5 SP1

谢谢, 罗伯特

【问题讨论】:

    标签: visual-c++ ffmpeg c++-cli managed-c++


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 如果我动态链接到它似乎也可以工作,但是单独的进程可能仍然是防止内存泄漏等的更好选择。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多