C++ FireBreath插件不';t利用所有插件实例

C++ FireBreath插件不';t利用所有插件实例,c++,opengl,firebreath,browser-plugin,C++,Opengl,Firebreath,Browser Plugin,我正在构建一个浏览器插件,它将在浏览器窗口中以幻灯片的形式绘制图片,但是我创建的插件只在第一个插件实例上绘制。如果我打开插件的多个实例,它会在第一个插件窗口上继续绘制重叠的图片 我正在使用opengl从url中绘制图片 以下是使用线程在循环中绘制虚拟opengl Tringle的代码: FB::PluginWindowWin*PluginWindowWin=dynamic_cast(pluginWindow) 有什么我做错的吗?从你在评论中告诉我的,你的主要问题是你从一个有缺陷的例子开始。记住,

我正在构建一个浏览器插件,它将在浏览器窗口中以幻灯片的形式绘制图片,但是我创建的插件只在第一个插件实例上绘制。如果我打开插件的多个实例,它会在第一个插件窗口上继续绘制重叠的图片

我正在使用opengl从url中绘制图片

以下是使用线程在循环中绘制虚拟opengl Tringle的代码:

FB::PluginWindowWin*PluginWindowWin=dynamic_cast(pluginWindow)


有什么我做错的吗?

从你在评论中告诉我的,你的主要问题是你从一个有缺陷的例子开始。记住,插件的每个实例都是在同一个过程中启动的;您正在使用的示例是一个简化的示例,它不使用插件的良好实践。最具体地说,它使用几个全局变量

除此之外,您正在线程化,但似乎没有进行任何锁定,以确保您是完全线程安全的。你生活在别人的过程中,你并不拥有它——浏览器拥有它。在很多事情上你都需要非常小心

崩溃很可能与未完全关闭有关,也可能与线程代码中的争用条件有关。解决这一问题的最佳方法是附加一个调试器,并找出它崩溃的地方,而不是只是绕圈子问“为什么?为什么???”(显然是为了验证效果)。在我告诉他们之前,很少有人做这个简单的步骤——附加调试器——你会感到震惊,但这应该始终是故障排除的第一步

最后,值得一提的是:您是否意识到,您正在构建一项6个月内无法实现的技术?FireFox将在年底取消对NPAPI的支持。我希望ActiveX的工作时间比这长一点,但edge不支持它

FireBreath 2(在2.0分支中)是FireBreath 1的一个重大变化,但它通过本机消息支持Chrome,也将支持FireFox。有很多,但我们会看看结果如何。请随意点击链接并投票,因为我想这也会对你有所帮助

问题是,您无法通过本地消息传递获得SDL或SDL2;您必须使用WebGL并在javascript端进行开发,然后通过本机消息传递获取数据。或者,你也可以研究一下使用哪种工具,它确实有一些opengl/绘图的东西(甚至SDL?不确定),但它是沙盒,可能有也可能没有你需要的网络东西。当然,它也只适用于Chrome


值得深思。祝你好运。

你在哪个浏览器上看到过这种情况?您是处于窗口模式还是无窗口模式?(我想是窗口化的,但如果不是,那是个大问题)。您是否正在为插件的每个实例启动线程的新实例?每个线程是否都有自己的数据,包括自己的插件hwnd实例?你是否意识到SetFocus调用,如果它有任何作用的话,在开始时只调用一次,并且在每个窗口中不再调用,这意味着只有最后一个窗口仍然具有焦点?这在firefox和IE上都会发生,我只使用窗口模式。此外,每个插件实例都有自己的线程和数据。关于SetFocus,我只是使用opengl示例插件中的代码来复制我在原始实现中面临的问题,删除SetFocus并不会对输出产生任何影响。您可以添加hDC和hRC的定义吗?我想这些不是共享的?是的,它们不是共享的。代码与ThreadedOpenLTestPlugin演示插件示例中的代码相同,当运行多个实例时,演示插件本身就会崩溃。我看到了两种可能性:1)openGL或您的openGL代码在同一过程中无法在两个不同的窗口中工作;2)您拥有比您意识到的更共享的东西。没有看到更多的代码,我猜不出是哪个。谢谢你的评论,我会努力找出哪里出了问题。不过,对于调试,我使用调试器解决了以前遇到的一些问题,但Firefox中插件崩溃只会关闭调试器,不会在崩溃报告中提供任何有用的信息。如果是这种情况,那么您的调试器连接不正确--仅供参考
EnableOpenGL(pluginWindowWin->getHWND(), &hDC, &hRC);
SetFocus(pluginWindowWin->getHWND());
//FB::
static int fps = 1;
GLfloat rotate = 0;
static double start = 0, diff, wait;
wait = 1 / fps;

//return 0;
while (true)
{

    //lets check for keyboard input
    try
    {
        FB::Rect pos = pluginWindow->getWindowPosition();

        PAINTSTRUCT ps;
        if (pluginWindowWin){
            hDC = BeginPaint(pluginWindowWin->getHWND(), &ps);

            pos.right -= pos.left;
            pos.left = 0;
            pos.bottom -= pos.top;
            pos.top = 0;

            rotate += 0.1f;

            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT);

            glPushMatrix();
            glRotatef(rotate, 0.0f, 1.0f, 0.0f);
            glBegin(GL_TRIANGLES);

            glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
            glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f);
            glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f);
            glEnd();

            glBegin(GL_QUADS);                                              // Draw A Quad
            glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.0f);                           // Top Left
            glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.0f);                            // Top Right
            glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.0f);                           // Bottom Right
            glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.0f);                           // Bottom Left
            glEnd();                                                        // Done Drawing The Quad
            glPopMatrix();
            glRotatef(rotate, 0.0f, 1.0f, 0.0f);


            SwapBuffers(hDC);
        }
        //rtri+=0.1f;
        ::SetTextAlign(hDC, TA_CENTER | TA_BASELINE);
        LPCTSTR pszText = _T("FireBreath Plugin!\n:-)");

        ::TextOut(hDC, pos.left + (pos.right - pos.left) / 2, pos.top + (pos.bottom - pos.top) / 2, pszText, lstrlen(pszText));

        if (pluginWindowWin) {
            // Release the device context
            EndPaint(pluginWindowWin->getHWND(), &ps);
        }
    }
    catch (...)
    {
        return 0;
    }



    Sleep(10);


}//end of while run