C++/CLI -- 0xc000007b (INVALID_IMAGE_FORMAT),带有 /clr 选项

发布于 2024-07-30 08:23:06 字数 434 浏览 6 评论 0原文

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

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

我的配置:

  • Visual Studio 2008 Professional SP1
  • Windows XP Pro SP3 (x86)
  • .NET Framework 3.5 SP1

谢谢, 罗伯特

I'm trying to build a C++/CLI executable to which I statically link ffmpeg (libavcodec, libavformat, libavutil & swscale). It works fine if I build it normally (without /clr, so no CLR support), it works. However, when I add CLR support, it won't start up with a 0xc000007b. A "Hello World" C++/CLI app runs fine, though.

Supposedly the same thing happens with Boost::Threads, but since ffmpeg is pure C, I doubt it's using Boost.

My config:

  • Visual Studio 2008 Professional SP1
  • Windows XP Pro SP3 (x86)
  • .NET Framework 3.5 SP1

Thanks,
Robert

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼眸印温柔 2024-08-06 08:23:06

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

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

It might not use boost, but it probably uses threads and thread local storage, which leads to the same problem. CLR is not compatible with __declspec(thread). I believe there is no simple work-around, unless you are willing to modify ffmpeg code (if you are, google those keywords for examples: clr, __declspec(thread) ).

I suggest isolating ffmpeg in a different process and using some means of interprocess communication.

痴意少年 2024-08-06 08:23:06

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

I've seen a similar issue that involved DirectEditServices. The solution ended up being related the Thread Apartment type. In .Net 2.0 and later the default thread apartment type switched from STA to MTA. Some native C++ objects do not support MTA. I had success by spawning a thread and manually setting the apartment type to STA. Keep in mind that any interprocess communications with a native C++ object that does not support STA must occur on the STA thread that instantiates the object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文