Как передать объект C ++ в плагин NPAPI? - PullRequest
1 голос
/ 21 октября 2011

Я пишу плагин NPAPI на C ++ для Windows.Когда мой плагин создан, я хочу передать ему некоторые личные данные из моего основного приложения (в частности, я хочу передать ему указатель на объект C ++).Кажется, нет механизма для этого.Я что-то пропустил?Я не могу просто создать свой объект в экземпляре плагина, поскольку он должен существовать вне области действия экземпляра плагина и сохраняется даже при уничтожении экземпляра плагина.

Редактировать:

Я использую встроенный плагин в C ++ через CEF.Это означает, что мой код по сути является браузером и плагином.Очевидно, это не так, как ведут себя стандартные плагины NPAPI, поэтому, вероятно, это не то, что поддерживается самим NPAPI.

Ответы [ 2 ]

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

Вы не можете передать объект C ++ в javascript; что вы можете сделать, это передать NPObject, который также является объектом C ++ и предоставляет доступ через интерфейс NPRuntime.

См. http://npapi.com/tutorial3 для получения дополнительной информации.

Вы также можете посмотреть на FireBreath фреймворк, который значительно упрощает подобные вещи.

Редактировать : кажется, я неправильно понял ваш вопрос. Вам нужно иметь возможность хранить данные, связанные с экземпляром плагина. Что вам нужно, так это NPP, который вы получаете при создании вашего плагина; АЭС состоит из двух членов: ndata (данные netscape) и pdata (данные плагинов). Вы можете контролировать указатель pdata - вы можете установить его так, чтобы он указывал на любое произвольное значение, которое вы хотите, а затем приводить его к реальному типу всякий раз, когда вы захотите его использовать. Обязательно приведите его обратно и удалите на NPP_Destroy, конечно. Я обычно создаю структуру, чтобы хранить в ней несколько частей информации. FireBreath использует это и отправляет все вызовы плагинов в экземпляр объекта Plugin, чтобы вы могли действовать так, как будто это обычный объект.

Пример соответствующего кода из FireBreath: https://github.com/firebreath/FireBreath/blob/master/src/NpapiCore/NpapiPluginModule_NPP.cpp#L145

Обратите особое внимание на NPP_New и NPP_Destroy; Также обратите особое внимание на то, как используется элемент pdata на АЭС.

Это также обсуждается в http://npapi.com/tutorial2

1 голос
/ 27 октября 2011

Невозможно сделать это через NPAPI, поскольку концепция не имеет смысла в терминах NPAPI. Даже если вы взломаете что-то, что обнуляет необработанный указатель, предполагая, что все выполняется в одном процессе, поэтому, если CEF переключится на многопроцессный подход, который используется в Chromium, хак прекратится.

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

...