Плагин FireBreath не работает на всех экземплярах плагина

Я создаю плагин для браузера, который рисует изображения в виде слайд-шоу внутри окон браузера, однако созданный мной плагин рисует только на первом экземпляре плагина. Если я открываю несколько экземпляров плагина, он продолжает рисовать в первом окне плагина, перекрывая каждую картинку.

Я использую OpenGL, чтобы нарисовать картинку из URL.

Ниже приведен код, который рисует фиктивные tringles opengl в цикле, используя поток:

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

Любая вещь, которую я делаю не так здесь?

-1

Решение

Из того, что вы сказали мне в комментариях, ваша основная проблема заключается в том, что вы начинаете с некорректного примера. Помните, что каждый экземпляр плагина запускается в одном и том же процессе; пример, который вы используете, является упрощенным, который не использует передовой опыт для плагинов. В частности, он использует несколько глобальных переменных.

В дополнение к этому, вы работаете с потоками, но, похоже, не делаете никаких блокировок, чтобы убедиться, что вы полностью безопасны. Вы живете в чужом процессе, вам не принадлежит — браузер. Вы должны быть очень осторожны со многими вещами.

Скорее всего, ваш сбой связан с неполным завершением работы или, возможно, с состоянием гонки в вашем поточном коде. Лучший способ устранить неполадки, это подключить отладчик и выяснить, где он выходит из строя, а не просто бегать кругами, спрашивая: «Почему? Почему ???!?» (преувеличивая для эффекта, очевидно). Вы будете шокированы тем, как мало людей делают этот простой шаг — подключают отладчик — пока я не скажу им об этом, но это всегда должен быть ваш первый шаг в устранении неполадок при сбое.

Наконец, возникает вопрос: понимаете ли вы, что строите это на технологии, которая не будет доступна через 6 месяцев? FireFox удаляет поддержку NPAPI в конце года. Я ожидаю, что ActiveX будет работать немного дольше, но Edge его не поддерживает.

FireBreath 2 (в ветке 2.0) — это серьезное изменение по сравнению с Firebreath 1, но он поддерживает Chrome через собственные сообщения и также поддерживает FireFox. Здесь очень много пытаясь убедить MS добавить встроенную поддержку обмена сообщениями в Edge, но посмотрим как пойдет. Не стесняйтесь переходить по этой ссылке и голосовать, так как я думаю, это также поможет вам.

Дело в том, что вы не получаете SDL или SDL2 с собственным обменом сообщениями; вам нужно будет использовать WebGL и выполнить разработку на стороне javascript, а затем перенести данные через собственный обмен сообщениями. поочередно вы можете посмотреть на использование NaCL который имеет некоторые opengl / материалы для рисования (может быть, даже SDL? не уверен), но находится в «песочнице» и может иметь или не иметь сетевых вещей, которые вам нужны. Также, конечно, это работает только на Chrome.

Пища для размышлений. Удачи.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector