Как передать объект С++ в плагин NPAPI?

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

Изменить:

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


person Emerick Rogul    schedule 21.10.2011    source источник
comment
Что вы имеете в виду, ваше основное приложение. Вы говорите, что хотите передать объект из какого-то совершенно отдельного приложения, которое уже запущено, в экземпляр плагина? Если это так, в вашем вопросе нет ничего специфичного для NPAPI, поэтому вам, вероятно, повезет задать новый, более общий вопрос о том, как выполнять IPC в Windows (без упоминания NPAPI).   -  person smorgan    schedule 22.10.2011
comment
На самом деле, из ваших комментариев ниже кажется, что, возможно, вы используете NPAPI в качестве интерфейса плагина в своем собственном приложении, а не пишете плагин для браузера. NPAPI задуман как интерфейс подключаемого модуля браузера, поэтому, если вы не пишете подключаемый модуль браузера, ваша проблема заключается в том, что вы используете неправильный инструмент для работы.   -  person smorgan    schedule 22.10.2011
comment
Точно, извините за путаницу. См. редактирование моего вопроса выше.   -  person Emerick Rogul    schedule 26.10.2011


Ответы (2)


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

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

person smorgan    schedule 27.10.2011

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

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

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

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

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

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

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

person taxilian    schedule 21.10.2011
comment
Я не пытаюсь передать объект C++ в JavaScript; Я пытаюсь передать указатель на объект C++ в свой плагин, чтобы он был доступен в интерфейсе NPAPI на стороне C++ (например, я хотел бы получить к нему доступ в NPP_SetWindow и связанных с ним функциях, если это возможно). Мне кажется странным, что нет (очевидного?) способа передать личные данные моему плагину NPAPI. - person Emerick Rogul; 22.10.2011
comment
Извините, я неправильно понял; Я пересмотрел свой ответ, чтобы, надеюсь, лучше ответить на ваш вопрос. Предложение, если можно: не голосуйте, пока не дадите людям возможность пересмотреть свой ответ, если они просто неправильно вас поняли. Вы можете так сильно их разозлить, что они не будут утруждать себя ответом. Кроме того, если бы вы перешли по ссылке на учебник и осмотрелись, вы бы нашли ответ на мой вопрос на tutorial2; при условии, что это много чтения. Я бы по-прежнему рекомендовал смотреть на FireBreath, а не делать это вручную. - person taxilian; 22.10.2011
comment
В опубликованном вами примере (NpapiPluginModule_NPP.cpp) экземпляр NpapiDataHolder создается в NPP_New и связан с pdata. Это я понял, но моя проблема в том, что я хочу связать объект с pdata, который был создан до создания экземпляра плагина. Другими словами, я надеялся, что есть какой-то доступный механизм, который позволит мне передать мой собственный указатель данных в NPP_New. Я начинаю думать, что единственный способ сделать это - использовать SetWindowLongPtr, чтобы связать мой указатель данных с дескриптором окна; Затем я мог получить этот указатель в NPP_SetWindow. - person Emerick Rogul; 22.10.2011
comment
(Кстати, я ценю ваши ответы и приношу свои извинения, если мой первоначальный вопрос был неясен. Это сложно объяснить четко. :-) - person Emerick Rogul; 22.10.2011
comment
Я не уверен, как вы могли иметь объект, специфичный для экземпляра плагина, до вызова NPP_New; браузер вызывает NPP_New, и вы ничего не можете сделать, чтобы изменить то, как это вызывается. Однако ничто не мешает вам иметь где-то глобальный объект, к которому вы можете получить доступ из экземпляра вашего плагина, или иметь глобальную карту для сопоставления некоторого идентификатора (который вы можете передать из javascript и т. д.) в экземпляр объекта; Кажется, я действительно не понимаю вашего вопроса. Загляните как-нибудь на npapi.com/chat, и я посмотрю, смогу ли помочь лучше. Я GMT -0600 и обычно в светлое время суток, иногда в выходные - person taxilian; 22.10.2011
comment
Я использую встроенный плагин, созданный на C++ через CEF (Chromium Embedded Framework). Извините, я должен был упомянуть об этом в своем первоначальном вопросе; мне не приходило в голову, что это имеет значение, но это очевидно. - person Emerick Rogul; 26.10.2011