Я создаю плагин для браузера, который рисует изображения в виде слайд-шоу внутри окон браузера, однако созданный мной плагин рисует только на первом экземпляре плагина. Если я открываю несколько экземпляров плагина, он продолжает рисовать в первом окне плагина, перекрывая каждую картинку.
Я использую 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
Любая вещь, которую я делаю не так здесь?
Из того, что вы сказали мне в комментариях, ваша основная проблема заключается в том, что вы начинаете с некорректного примера. Помните, что каждый экземпляр плагина запускается в одном и том же процессе; пример, который вы используете, является упрощенным, который не использует передовой опыт для плагинов. В частности, он использует несколько глобальных переменных.
В дополнение к этому, вы работаете с потоками, но, похоже, не делаете никаких блокировок, чтобы убедиться, что вы полностью безопасны. Вы живете в чужом процессе, вам не принадлежит — браузер. Вы должны быть очень осторожны со многими вещами.
Скорее всего, ваш сбой связан с неполным завершением работы или, возможно, с состоянием гонки в вашем поточном коде. Лучший способ устранить неполадки, это подключить отладчик и выяснить, где он выходит из строя, а не просто бегать кругами, спрашивая: «Почему? Почему ???!?» (преувеличивая для эффекта, очевидно). Вы будете шокированы тем, как мало людей делают этот простой шаг — подключают отладчик — пока я не скажу им об этом, но это всегда должен быть ваш первый шаг в устранении неполадок при сбое.
Наконец, возникает вопрос: понимаете ли вы, что строите это на технологии, которая не будет доступна через 6 месяцев? FireFox удаляет поддержку NPAPI в конце года. Я ожидаю, что ActiveX будет работать немного дольше, но Edge его не поддерживает.
FireBreath 2 (в ветке 2.0) — это серьезное изменение по сравнению с Firebreath 1, но он поддерживает Chrome через собственные сообщения и также поддерживает FireFox. Здесь очень много пытаясь убедить MS добавить встроенную поддержку обмена сообщениями в Edge, но посмотрим как пойдет. Не стесняйтесь переходить по этой ссылке и голосовать, так как я думаю, это также поможет вам.
Дело в том, что вы не получаете SDL или SDL2 с собственным обменом сообщениями; вам нужно будет использовать WebGL и выполнить разработку на стороне javascript, а затем перенести данные через собственный обмен сообщениями. поочередно вы можете посмотреть на использование NaCL который имеет некоторые opengl / материалы для рисования (может быть, даже SDL? не уверен), но находится в «песочнице» и может иметь или не иметь сетевых вещей, которые вам нужны. Также, конечно, это работает только на Chrome.
Пища для размышлений. Удачи.
Других решений пока нет …