Как получить Экземпляр АЭС внутри плагина NPAPI C - PullRequest
2 голосов
/ 16 апреля 2009

Я написал плагин NPAPI в C, который должен вызывать функцию NPN_Invoke (для вызова функции JavaScript).

Но NPN_Invoke () принимает экземпляр NPP в качестве параметра.

Только функции NP_New () и NP_Destroy () получают экземпляр NPP. Как мне получить этот экземпляр АЭС?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

На самом деле лучший способ - это расширить NPObject полем, чтобы сохранить связанный экземпляр NPP, и предоставить функции выделения / освобождения с вашим определением NPClass. Затем вы можете привести NPObject к вашему подтипу, чтобы получить доступ к фактическому экземпляру NPP.

Я бы НЕ рекомендовал сделать это на глобальном уровне (NP_GetEntryPoints и т. Д.), Как предложено выше, поскольку потенциально может быть загружено несколько экземпляров вашего плагина - возможно, даже на одной странице - и вы хотите чтобы убедиться, что вы вызываете правильный. К сожалению, существует много примеров кода, где какой-то случайный экземпляр просто хранится в глобальной переменной и обновляется в максимально возможной степени.

В качестве примера, принимая C ++, вы захотите расширить NPObject:

struct MyNPObject : public NPObject {
  NPP npp_;
  explicit MyNPObject(NPP npp) : npp_(npp) {}
};

Тогда вашему определению NPClass нужно будет иметь определения размещения и освобождения:

static NPClass obj_Class = {
  NP_CLASS_STRUCT_VERSION,
  &obj_allocate,
  &obj_deallocate,
  NULL,
  &obj_hasMethod,
  &obj_invoke,
  ...

Что может быть реализовано так:

static NPObject* obj_allocate(NPP npp, NPClass *aClass)
{
  return new MyNPObject(npp);
}

static void obj_deallocate(NPObject *obj)
{
  delete obj;
}

А когда вам нужно вызвать NP_Invoke, предполагая, что у вас есть NPObject * (например, внутри obj_invoke), вы просто понижаетесь:

MyNPObject* myObj = reinterpret_cast<MyNPObject*>(obj);
g_browser->invoke(myObj->npp, ...)
1 голос
/ 24 июня 2009

В NP_GetEntryPoints определите свою собственную функцию NP_yourNew. Теперь, когда после NP_New платформа вызывает ваш NP_yourNew с экземпляром. Экземпляр может быть сохранен при вызове вашего обратного вызова.

...