从另一个DLL调用功能时插件应用程序挂起

时间:2010-01-08 21:50:08

标签: c++ dll

我正在尝试渲染在XUL窗口上运行的GStreamer管道。

为此,我写了一个XPCOM插件。 XPCOM插件基本上是一个由Gecko引擎加载的dll文件。我的插件与GStreamer链接,因此它依赖于许多其他GStreamer插件(也是dll文件)。

调用GStreamer代码(例如像gst_pipeline_new这样的简单函数)会导致应用程序崩溃。更具体地说,它会冻结并挂起消耗整个CPU内核(占总CPU的50%)的glib:

alt text

有人愿意帮我弄清楚出了什么问题吗?

修改

一些评论:

  • Windows上的独立GStreamer项目工作正常。
  • XUL插件也可以正常工作(只要我不进行任何GStreamer调用)。
  • 在XUL插件中,我可以调用一个简单的glib函数,比如g_strndup,没有任何问题。
  • 从插件中调用GStreamer功能会使应用程序崩溃。

此代码可以重现该问题。 (我不确定它是否有用......)

插件.idl文件定义属性videoWindow

#include "nsISupports.idl"
interface nsIDOMXULElement;

[scriptable, uuid(BFE3F1BF-1C7B-4da2-8EAB-12F7683FAF71)]
interface IVideo : nsISupports
{
  attribute nsIDOMXULElement videoWindow;
};

它的实现可以重现这个问题:

NS_IMETHODIMP Video::SetVideoWindow(nsIDOMXULElement * inXULVideoWindow)
{
    GstElement * pipeline = gst_pipeline_new("test"); // freezes here
    return NS_OK;
}

修改
问题是固定的。看看我自己对这篇文章的回答。

2 个答案:

答案 0 :(得分:0)

修复符号以便您可以阅读gstreamer和glib函数 - 这可能需要从源代码编译这两个库。一旦你看到真正的堆栈,解决问题将更容易

答案 1 :(得分:0)

好的,我很尴尬......我忘了执行GStreamer初始化函数:

gst_init(NULL, NULL);

问题现已解决。