2016-07-17 21 views
-1

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

我使用的是opengl从URL中绘制图片。

以下是使用线程其中提请虚设的OpenGL tringles在一个循环中一个代码:

FB :: PluginWindowWin * pluginWindowWin = dynamic_cast的(pluginWindow);

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 

我在做什么错在这里?

+0

什么浏览器(s)你见过这种情况?你是在开窗还是无窗模式? (我假设有窗口,但如果不是这是个大问题)。你是否为插件的每个实例启动线程的新实例?每个线程都有自己的数据,包括它自己的插件hwnd实例吗?您是否意识到SetFocus调用(如果它执行了任何操作)只会在开始时调用一次,而不会再次调用每个窗口,这意味着只有最后一个调用仍然有焦点? – taxilian

+0

这发生在Firefox和IE上,我只使用窗口模式。另外每个插件实例都有自己的线程和数据。 关于SetFocus我刚刚使用了opengl示例插件中的代码来复制我正在面对的问题以及我的原始实现,删除SetFocus并没有在输出中产生任何影响。 –

+0

你可以添加hDC和hRC的定义吗?我认为这些不共享? – taxilian

回答

1

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

此外,你是线程,但似乎没有做任何锁,以确保你完全线程安全。你生活在别人的过程中,你不拥有它 - 浏览器。你需要对很多事情非常小心。

您的崩溃很可能与您的线程代码中没有完全关闭或者竞争条件有关。解决这个问题的最佳方式是附加一个调试器并找出它的崩溃位置,而不是在圈子里跑来跑去问“为什么?为什么?!?”? (显然是为了实现效果)。你会很震惊,很少有人做这么简单的一步 - 附加一个调试器 - 直到我告诉他们,但它应该始终是你排除故障的第一步。

最后,它提出了问题:你是否意识到,你正在建立一个6个月内无法使用的技术? FireFox将在年底取消对NPAPI的支持。我预计ActiveX的工作时间会比这长,但是Edge不支持它。

FireBreath 2(在2.0分支中)是firebreath 1的一个重大改变,但它通过本地消息传递支持Chrome,并且也支持FireFox。有很多trying to convince MS to add native messaging support to Edge,但我们会看到如何。随意遵循该链接和投票,因为它会帮助你,以及我怀疑。

事情是,你没有得到SDL或SDL2 W /本机通讯;你必须使用WebGL并在JavaScript端进行开发,然后通过本地消息传递数据。或者你可以考虑使用NaCL,它有一些opengl /绘图的东西(甚至可能是SDL?不知道),但是是沙盒的,可能有也可能没有你需要的网络。当然,它也只适用于Chrome。

思考的食物。祝你好运。

+0

谢谢你的评论,我会试着找出错误的地方。不过,对于调试,我使用调试器来解决我以前遇到的几个问题,但Firefox中的插件崩溃只是关闭了调试器,并没有在崩溃报告中提供任何有用的信息。 –

+0

如果是这种情况,那么你没有你的调试器连接正确 - 仅供参考 – taxilian